entityframework作为一个orm框架的确很不错,个人使用上也很舒服,但是其本身存在一些问题如下:
1.删除、更新等操作很麻烦,默认都需要查询出记录再修改
2.批量操作不方便
对应的可以添加一些第三方dll,来弥补
1.EntityFramework.Extended 可以直接对数据进行更新或删除
db.Users.Where(x => x.ID == 2).Update(b => new User { UserName = "ss" });
db.Users.Where(x => x.ID == 2).Delete();或者db.Users.Delete(x=>x.ID==2);
两个操作都是直接调用ado生成SQL语句来操作数据库的,因此不需要调用savechanges,但是也意味着其他的上下文是不知道数据源的修改的
2.Z.EntityFramework.Extensions 主要是添加了批量操作,由于是收费的就不过多介绍了
以下介绍一些特殊使用方式:
一.表达式作为条件
using LinqKit;
var whereLambda = PredicateBuilder.New<Pre>();
whereLambda = whereLambda.And(p => p.CabNo==SoftConfig.CabNo)
灵活生成express填入EF查询条件
var data = db.Pre.Where(whereLambda).ToList();
二.分组查询
var lstPreMed = SoftConfig.db.View_PreMedInfo.Where(x => lstPreNo.Contains(x.PreNo) && x.CabNo == SoftConfig.CabNo).GroupBy(x => new
{
x.MedStockIndex,
x.MedCode,
x.MedName,
x.MedSpec,
x.MedArea,
x.Batch,
x.Expiration,
x.Unit,
x.Layer,
x.Col,
x.Cell,
x.LightNo
}).Select(x => new CPreMed
{
MedStockIndex = (int)x.Key.MedStockIndex,
MedCode = x.Key.MedCode,
MedName = x.Key.MedName,
MedSpec = x.Key.MedSpec,
MedArea = x.Key.MedArea,
Batch=x.Key.Batch,
Expiration=(DateTime)x.Key.Expiration,
Unit = (int)x.Key.Unit,
Layer = (int)x.Key.Layer,
Col = (int)x.Key.Col,
Cell = (int)x.Key.Cell,
LightNo = (int)x.Key.LightNo,
TotalAmount = x.Sum(i => i.MedAmount)
}).OrderBy(x => x.Layer).ThenBy(x => x.Unit).ThenBy(x => x.Col).ToList();
三.EF存储过程的使用