entity framework 6 通用数据类
原文 http://blog.csdn.net/laokaizzz/article/details/25730813
public class BaseDAL
{
string strConn = "";
public BaseDAL(string connString)
{
strConn = connString;
} #region 通用增删改查
#region 非原始sql语句方式
/// <summary>
/// 新增
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Add<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Entry<T>(entity).State = EntityState.Added;
return db.SaveChanges() > ;
}
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Update<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
return db.SaveChanges() > ;
}
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">实体</param>
/// <returns>返回受影响行数</returns>
public bool Delete<T>(T entity) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > ;
}
} /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="deleWhere">删除条件</param>
/// <returns>返回受影响行数</returns>
public bool DeleteByConditon<T>(Expression<Func<T, bool>> deleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
List<T> entitys = db.Set<T>().Where(deleWhere).ToList();
entitys.ForEach(m => db.Entry<T>(m).State = EntityState.Deleted);
return db.SaveChanges() > ;
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
public T GetSingleById<T>(int id) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().Find(id);
}
} /// <summary>
/// 查找单个
/// </summary>
/// <param name="seleWhere">查询条件</param>
/// <returns></returns>
public T GetSingle<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().FirstOrDefault(seleWhere);
}
} /// <summary>
/// 获取所有实体集合
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>() where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T, Tkey>(Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).ToList<T>();
}
} /// <summary>
/// 获取所有实体集合(多个排序)
/// </summary>
/// <returns></returns>
public List<T> GetAll<T>(params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).ToList();
}
} /// <summary>
/// 单个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhere">排序条件</param>
/// <param name="isDesc">是否倒序</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T, Tkey>(IQueryable<T> data, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
if (isDesc)
{
return data.OrderByDescending(orderWhere);
}
else
{
return data.OrderBy(orderWhere);
}
} /// <summary>
/// 多个排序通用方法
/// </summary>
/// <typeparam name="Tkey">排序字段</typeparam>
/// <param name="data">要排序的数据</param>
/// <param name="orderWhereAndIsDesc">字典集合(排序条件,是否倒序)</param>
/// <returns>排序后的集合</returns>
public IQueryable<T> CommonSort<T>(IQueryable<T> data, params OrderModelField[] orderByExpression) where T : class
{
//创建表达式变量参数
var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > )
{
for (int i = ; i < orderByExpression.Length; i++)
{
//根据属性名获取属性
var property = typeof(T).GetProperty(orderByExpression[i].PropertyName);
//创建一个访问属性的表达式
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = "";
if (i > )
{
OrderName = orderByExpression[i].IsDESC ? "ThenByDescending" : "ThenBy";
}
else
OrderName = orderByExpression[i].IsDESC ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType },
data.Expression, Expression.Quote(orderByExp)); data = data.Provider.CreateQuery<T>(resultExp);
}
}
return data;
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Set<T>().AsExpandable().Where(seleWhere).ToList();
}
} /// <summary>
/// 根据条件查询实体集合
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, TValue>(Expression<Func<T, TValue>> seleWhere, IEnumerable<TValue> conditions) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{ return db.Set<T>().AsExpandable().WhereIn<T, TValue>(seleWhere, conditions).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(单个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T, Tkey>(Expression<Func<T, bool>> seleWhere, Expression<Func<T, Tkey>> orderWhere, bool isDesc) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).ToList();
}
} /// <summary>
/// 根据条件查询实体集合(多个字段排序)
/// </summary>
/// <param name="seleWhere">查询条件 lambel表达式</param>
/// <returns></returns>
public List<T> GetList<T>(Expression<Func<T, bool>> seleWhere, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderByExpression).ToList();
}
} /// <summary>
/// 获取分页集合(无条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(无条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, out int totalcount, params OrderModelField[] orderByExpression) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable(), orderByExpression).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件无排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return db.Set<T>().AsExpandable().Where(seleWhere).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件单个排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T, Tkey>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
Expression<Func<T, Tkey>> orderWhere, bool isDesc, out int totalcount) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderWhere, isDesc).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
} /// <summary>
/// 获取分页集合(有条件多字段排序)
/// </summary>
/// <returns></returns>
public List<T> GetListPaged<T>(int pageIndex, int pageSize, Expression<Func<T, bool>> seleWhere,
out int totalcount, params OrderModelField[] orderModelFiled) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
totalcount = db.Set<T>().AsExpandable().Where(seleWhere).Count();//获取总数
//需要增加AsExpandable(),否则查询的是所有数据到内存,然后再排序 AsExpandable是linqkit.dll中的方法
return CommonSort(db.Set<T>().AsExpandable().Where(seleWhere), orderModelFiled).Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}
}
#endregion #region 原始sql操作
/// <summary>
/// 执行操作
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
public void ExecuteSql(string sql, params object[] paras)
{
using (SysDb db = new SysDb(strConn))
{
db.Database.ExecuteSqlCommand(sql, paras);
}
} /// <summary>
/// 查询列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public List<T> QueryList<T>(string sql, params object[] paras) where T : class
{
using (SysDb db = new SysDb(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).ToList();
}
} /// <summary>
/// 查询单个
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public T QuerySingle<T>(string sql, params object[] paras) where T : class
{
using (SysDb<T> db = new SysDb<T>(strConn))
{
return db.Database.SqlQuery<T>(sql, paras).FirstOrDefault();
}
} /// <summary>
/// 执行事务
/// </summary>
/// <param name="lsSql"></param>
/// <param name="lsParas"></param>
public void ExecuteTransaction(List<String> lsSql, List<Object[]> lsParas)
{
using (SysDb db = new SysDb(strConn))
{
using (var tran = db.Database.BeginTransaction())
{
try
{
for (int i = ; i < lsSql.Count; i++)
{
if (lsParas != null && lsParas.Count > )
{
db.Database.ExecuteSqlCommand(lsSql[i], lsParas[i]);
}
}
foreach (String item in lsSql)
{
db.Database.ExecuteSqlCommand(item);
} tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
}
#endregion
#endregion #region 通用属性
/// <summary>
/// 获取数据库服务器当前时间。
/// </summary>
public DateTime ServerTime
{
get
{
using (SysDb db = new SysDb(strConn))
{
String sql = "SELECT GETDATE()";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToDateTime(objServerTime);
}
}
} /// <summary>
/// 获取数据库版本。
/// </summary>
public String DatabaseVersion
{
get
{
using (SysDb db = new SysDb(strConn))
{
try
{
String sql = "SELECT Version FROM Sys_Version";
Object objServerTime = db.Database.SqlQuery<Object>(sql);
return Convert.ToString(objServerTime);
}
catch
{
}
return String.Empty;
}
}
}
#endregion }
public static class QueryableExtension
{
/// <summary>
/// 扩展方法 支持 in 操作
/// </summary>
/// <typeparam name="TEntity">需要扩展的对象类型</typeparam>
/// <typeparam name="TValue">in 的值类型</typeparam>
/// <param name="source">需要扩展的对象</param>
/// <param name="valueSelector">值选择器 例如c=>c.UserId</param>
/// <param name="values">值集合</param>
/// <returns></returns>
public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> source, Expression<Func<TEntity, TValue>> valueSelector,
IEnumerable<TValue> values)
{
if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
if (null == values) { throw new ArgumentNullException("values"); }
ParameterExpression p = valueSelector.Parameters.Single(); if (!values.Any())
{
return source;
}
var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return source.Where(Expression.Lambda<Func<TEntity, bool>>(body, p));
}
}
public struct OrderModelField
{ public bool IsDESC { get; set; }
public string PropertyName { get; set; }
}
dbcontext类: public class SysDb : DbContext
{
bool isNew = true;//是否是新的sql执行
string strMsg = "";//sql执行的相关信息
string strConn = "";//数据库连接字符串
string UserName = "";//日志用户名称
string AdditionalInfo = "";//日志额外信息
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
base.Database.Log = (info) => Debug.WriteLine(info);
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString)
{
strConn = connString;
Database.SetInitializer<SysDb>(null);//设置为空,防止自动检查和生成
UserName = logUserName;
AdditionalInfo = logAdditionalInfo;
base.Database.Log = AddLogger;
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//去掉复数映射
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
base.OnModelCreating(modelBuilder);
} /// <summary>
/// 添加日志
/// </summary>
/// <param name="info"></param>
public void AddLogger(string info)
{
if (info != "\r\n" && (!info.Contains("Sys_EventLog")))
{
string strTemp = info.ToUpper().Trim();
if (isNew)
{
//记录增删改
if (strTemp.StartsWith("INSERT") || strTemp.StartsWith("UPDATE") || strTemp.StartsWith("DELETE"))
{
strMsg = info;
isNew = false;
}
}
else
{
if (strTemp.StartsWith("CLOSED CONNECTION"))
{
//增加新日志
using (SysDb db = new SysDb(strConn))
{
try
{
//保存日志到数据库或其他地方 }
catch (Exception ex)
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "//logError.txt"))
{
sw.Write(ex.Message);
sw.Flush();
}
}
}
//清空
strMsg = "";
isNew = true;
}
else
{
strMsg += info;
}
} }
} }
public class SysDb<T> : SysDb where T : class
{
public SysDb(string connString) : // 数据库链接字符串
base(connString)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public SysDb(string connString, string logUserName, string logAdditionalInfo) : // 数据库链接字符串
base(connString,logUserName,logAdditionalInfo)
{
Database.SetInitializer<SysDb<T>>(null);//设置为空,防止自动检查和生成
} public DbSet<T> Entities { get; set; }
}
界面使用:(bll层忽略) public class BusinessController : Controller
{
//
// GET: /Jygl/Business/
BaseBLL basebll = new BaseBLL(WebHelper.Conn); public ActionResult GetXMList(int page,int rows)
{
int count = ;
//查询条件
//Expression<Func<JY_XM, bool>> searchPredicate = PredicateBuilder.True<JY_XM>();
//searchPredicate = searchPredicate.And(c => c.UserName.Contains(""));
Expression<Func<JY_XM, int>> keySelector = u => u.UID;
string str = ExceptionHelper<JY_XM>.TryCatchPageQueryJson<int>(basebll.GetListPaged, page, rows, keySelector, false, out count);
return Content(str);
} [HttpPost]
public ActionResult XMEdit(JY_XM jyxm)
{
basebll.Add(jyxm);
return View();
} public ActionResult GetAllGCLB()
{ List<DICT_GCLB> lsGCLB = basebll.GetAll<DICT_GCLB>();
DICT_GCLB dicNew=new DICT_GCLB();
dicNew.GCLBText="-请选择-";
dicNew.GCLBId=;
lsGCLB.Add(dicNew); return Content(WebHelper.Json(lsGCLB));
} public ActionResult GetAllArea()
{
List<DICT_Area> lsArea = basebll.GetAll<DICT_Area>();
DICT_Area dicNew=new DICT_Area();
dicNew.AreaText="-请选择-";
dicNew.AreaId=;
lsArea.Add(dicNew);
return Content(WebHelper.Json(lsArea));
}
}
entity framework 6 通用数据类的更多相关文章
- [翻译] - <Entity Framework> - 直接执行数据库命令
原文:[翻译] - <Entity Framework> - 直接执行数据库命令 纯属学习上的记录, 非专业翻译, 如有错误欢迎指正! 原文地址: http://msdn.microsof ...
- ASP.NET CORE系列【六】Entity Framework Core 之数据迁移
原文:ASP.NET CORE系列[六]Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framew ...
- 浅谈Entity Framework中的数据加载方式
如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...
- Entity Framework Code First 数据迁移
需要在[工具 --> NuGet 程序包管理器 --> 程序包管理器控制台]中输入三个命令: Enable-Migrations (初次迁移时使用) Add-Migration [为本次迁 ...
- 【转】Entity framework 6 编写的通用数据类
原文:http://blog.csdn.net/laokaizzz/article/details/25730813 准备参考
- EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据
在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...
- EntityFramework_MVC4中EF5 新手入门教程之五 ---5.通过 Entity Framework 读取相关数据
在前面的教程中,您完成School数据模型.在本教程中,您会读取和显示相关的数据 — — 那就是,实体框架将加载到导航属性的数据. 下面的插图显示页面,您将完成的工作. 延迟. 预先,和显式加载的相关 ...
- Asp .net core api+Entity Framework core 实现数据CRUD数据库中(附Git地址)
最近在学dotNetCore 所以尝试了一下api 这个功能 不多说了大致实现如下 1.用vs2017建立一个Asp.net Core Web 应用程序 在弹出的对话框中选择 Web API 项目名 ...
- Entity framework 配置文件,实现类,测试类
配置文件信息App.config: 数据库IP地址为192.168.2.186 ,数据库名为 Eleven-Six , 用户名 123456,密码654321 <?xml version=&qu ...
随机推荐
- git merge –squash介绍
Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: $ git merge another $ git checkout another # modif ...
- 了不起的分支和循环02 - 零基础入门学习Python008
了不起的分支和循环02 让编程改变世界 Change the world by program 上节课,小甲鱼教大家如何正确的打飞机,其要点就是:判断和循环,判断就是该是不该做某事,循环就是持续做某事 ...
- HDU 4405 Aeroplane chess(期望)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405 题意:从0走到n,每次走之前掷一次筛子,掷出几点就向前走几点,走到大于等于n的地方就停止.但是, ...
- HDU 4009 Transfer water
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...
- C51单片机内存优化
52本身有256B的数据存储区,如果没在意一些细节,很容易出现RAM超过128就报错的情况.现讲其问题解释如下: 最常见的是以下两种: ① 超过变量128后必须使用compact模式编译,实际的情况是 ...
- AnimateWindow
WINDOWS提供了一个很有意思的函数:AnimateWindow.之前我想实现像MSN,QQ这些收到邮件的时候动画方式,从地下升上来的显示一个窗口,感觉很麻烦,自己去写代码,效果很不理想,今天无意中 ...
- HMVC
HMVC(Hierarchical-Model-View-Controller),也可以叫做 Layered MVC.顾名思义,就是按等级划分的 MVC 模式,简单的解释就是把MVC又细分成了多个子 ...
- 最详细的 HTTPS 科普扫盲帖
为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...
- 应对Deadline,时间怎么安排?
问题定义 项目过程中,每项任务都是有时间要求的,一般体现为"截止时间".即Deadline. 怎样安排时间,才干在Deadline之前完毕任务呢? 有效实践 错误做法 在Deadl ...
- 机房收费系统中的Grid++Report报表设计器的应用
在进行账单查询功能的时候我应用了Grid++Report报表设计器,下面我就为大家介绍一下,还望大家多多指点. 首先,在Grid++Report报表设计器中进行报表界面的设置.在属性编辑窗口中这里对报 ...