今天和大家一起学习一下当前流行的MVC5+EF+AutoFac+AutoMapper轻型架构,先上一张框架图

一、项目基本框架搭建

MVC5+EF+AutoFac+AutoMapper轻型架构

 

写程序的顺序是Model-DAL-BLL-UI,Model层就是表实体,我们略过,下面上DAL层代码

using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace DAL
{
    public class BaseDal<T> where T : class, new()
    {
        public DataModel _currentDbContext = DbContextFactory.GetDbContext();

        public T Add(T item)
        {
            return _currentDbContext.Set<T>().Add(item);
        }

        public int Count(Expression<Func<T, bool>> predicate)
        {
            //set<t>针对对上下文和基础存储中给定类型的实体的访问返回一个 DbSet<TEntity> 实例。
            return _currentDbContext.Set<T>().Count(predicate);//返回指定序列中满足条件的元素数量。 
        }

        public bool Update(T entity)
        {
            //Attach将实体以“未更改”的状态放置到上下文中,就好像从数据库读取了该实体一样。
            _currentDbContext.Set<T>().Attach(entity);
            _currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;
            return _currentDbContext.SaveChanges() > 0;
        }

        public bool Delete(T entity)
        {
            _currentDbContext.Set<T>().Attach(entity);
            _currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted;
            return _currentDbContext.SaveChanges() > 0;
        }

        public bool Exist(Expression<Func<T, bool>> anyLambda)
        {
            return _currentDbContext.Set<T>().Any(anyLambda);
        }

        public T Find(Expression<Func<T, bool>> whereLambda)
        {
            T entity = _currentDbContext.Set<T>().FirstOrDefault();
            return entity;
        }

        public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc)
        {
            var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba);
            _list = OrderBy(_list, orderName, isAsc);
            return _list;
        }
         
        /// <summary>
        /// 排序
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="source">原IQueryable</param>
        /// <param name="propertyName">排序属性名</param>
        /// <param name="isAsc">是否正序</param>
        /// <returns>排序后的IQueryable<T></returns>
        private IQueryable<T> OrderBy(IQueryable<T> source, string propertyName, bool isAsc)
        {
            if (source == null) throw new ArgumentNullException("source", "不能为空");
            if (string.IsNullOrEmpty(propertyName)) return source;
            var _parameter = Expression.Parameter(source.ElementType);
            var _property = Expression.Property(_parameter, propertyName);
            if (_property == null) throw new ArgumentNullException("propertyName", "属性不存在");
            var _lambda = Expression.Lambda(_property, _parameter);
            var _methodName = isAsc ? "OrderBy" : "OrderByDescending";
            var _resultExpression = Expression.Call(typeof(Queryable), _methodName, new Type[] { source.ElementType, _property.Type }, source.Expression, Expression.Quote(_lambda));
            return source.Provider.CreateQuery<T>(_resultExpression);
        }


        public IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc)
        {
            var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba);
            totalRecord = _list.Count();
            //if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
            //else _list = _list.OrderByDescending<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
            _list = OrderBy(_list, orderName, isAsc).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
            return _list;
        }

    }
}
BaseDal

相关文章: