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。
第二个例子使用 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();