DbSet 两种 Where 查询的性能问题。

说白了 DBSet.Where() 有两个重载,一个是IQueryable还有一个是IEnumerable,前者则是会延迟执行,而后者则是将整个数据集加载出来之后再进行Where查询。

IQueryable这个查询对象接收的是Expression<Func<T,bool>>,也就是一个表达式树,他将会把查询条件解析成SQL,在数据源提供器里面执行查询。

而List是一个集合,他接收的是一个Func<T,bool>,也就是一个查询委托,他则是将整个DBSet加载出来放在内存之后,再进行查询,所以后者性能堪忧。

详细请查看StackOverflow上面的这两篇问题:

Func<t, bool> vs Manually expression performance in C# lambda

Why would you use Expression<Func> rather than Func?