在Where clausule中使用实例化的Func<>对性能产生不好的影响[重复]。

问题描述 投票:1回答:1

I dont know why the first code is much slower than the second code if I'm using the same query.I have repeated both codes and the times and memory usage are always higher in the first code.Any body could tell me why?

///// FIRST CODE /////
Func<Person, bool> filterWhere = (Person p) => { return p.Age >= 15; };

var result = DBcontext.Person.Where(filterWhere)
                             .ToList(); 
///// SECOND CODE /////
var result = DBcontext.Person.Where(p => p.Age >= 15)
                             .ToList();

注:DBContext在SQLServer 2016上使用EF6。

c# entity-framework linq linq-to-sql
1个回答
1
投票

第二个例子使用 IQueryable.Where<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>).

由于它接受的是 Expression查询可以被EF翻译成SQL,并在数据库级别执行。

第一个例子将lambda类型为 Func,而不是一个表达式,所以 Enumerable.Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 来代替。

这需要从数据库中检索整个数据集,而且过滤是在内存中进行的,因此性能受到影响。

如果你尝试下面的方法,它的性能应该和第二个例子类似。

Expression<Func<Person, bool>> filterWhere = (Person p) => { return p.Age >= 15; };

var result = DBcontext.Person.Where(filterWhere)
                             .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.