Entity Franmework LINQ TO Entity的性能问题和常见错误

最开始学习使用ASP.NET MVC,配套的访问持久数据是LINQ To SQL,简单好用,一般项目无需关注连接数据库对象,和性能问题,但随着发展,微软竟然解散LINQ to SQL团队,改为EF,为了兼容众多数据库,改为LINQ to Entities;

最近做几个项目,本来还是使用LINQ To SQL,但感觉官方基本不维护,激励推崇LINQ to Entities,觉得相差性不大,所以在新项目使用了LINQ to Entities,结果掉入深坑,本来2周能搞定的项目,足足一个月才把LINQ to Entities的几个坑给弄明白,

几个tip

1、IQueryable和IEnumerable的使用:

对LINQ to Entities何时返回IQueryable,何时返回IEnumerable,一定要弄明白,不然谬之千里,记住IQueryable对象是一系列 lambda Expression构造sql语句,并不立即执行返回对象,只有在ASEnumerable,才把SQL 语句执行收到返回对象,也就是IQueryable的时候尽量多限定查询条件,这样通过SQL带条件的去查询,性能会提升不少,而IEnumerable对象是直接把数据接收到内存中,所有在IEnumerable对象后的where其实性能上都是在内存中操作,这样性能并不好,因为大量的数据到内存是很消耗性能的;

如果允许(即不报错)尽量在IQueryable上面做where,然后带入条件去数据库取需要的最小数据,IEnumerable是需要做数据的操作的时候基于取好的数据做where、sum等操作

 

2、Any和Count的使用

if (db.table.AsNoTracking().Any(expression)){

}

int count=db.table.AsNoTracking().Where(expression).count()

if(count>0){

}

他们是等效的,但使用Any的效率要高

3、还有对于视图的查询

db.view.where(expression)和db.view.AsNoTracking().where(expression)不是性能上不同,而是数据结果上就是完全不同的,带AsNoTracking()是将视图中去除了重复

4、where条件检索==字符串(重点重点)----不要觉得从数据库取出来再处理,一定要按需去取多加限定条件

对于表中查询字段有空的情况下,下面两种查询效率完全不是一个等级,也就是尽量能有限定条件就加上

expression = expression.And(o => !String.IsNullOrEmpty(o.Field) && o.Field== Fieldvalue);性能高

expression = expression.And(o =>  o.Field== Fieldvalue);性能低

5、select、sum的使用,请看下面两种情况:

如果db.Table.AsNoTracking().Where(expression)可能返回空的情况下同时Field也可能为空的情况下,

return db.Table.AsNoTracking().Where(expression).Sum(m => m.Field) ?? 0;

return db.Table.AsNoTracking().Where(expression).Sum(m => m.Field?? 0);

第二种写法会报错:

The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

因为Sum前面的查询结果可能为空的,而不是查出的结果Field为空

所以要使用第一种写法

 

总结,使用LINQ to Entities,大家都评论性能不好,各种问题,但我觉得LINQ to Entities最大的问题是在开发环境中各种lambda Expression都可以使用,不提示错误,等到系统运行的时候各种错就爆出来了,要么什么类型不能转换,要么条件类型不能识别,而且调试的时候lambda Expression表达式又不能很明确定位;所以很恼火,既然不支持某些类型的lambda Expression的写法,你开发环境的时候又不报提示,还允许各种写法感觉很兼容,然后运行的时候就各种错误,我觉得这是LINQ to Entities的最大问题;但几也就这几个类型不识别、类型不转换的问题,其实去百度几次基本就了解了,也不是什么问题

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石头商人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值