Entity Framework - Func引发的数据库全表查询

Entity Framework - Func引发的数据库全表查询

使用 Entity Framework 最要当心的性能杀手就是 —— 不正确的查询代码形成的数据库全表查询。html

咱们就遇到了一次,请看下面的示例代码:数据库

复制代码

Func<QuestionFeed, > predicate = ;
 (type == )
{
    predicate = f => f.FeedID == id && f.IsActive == ;
}

{
    predicate = f => f.FeedID == id;
}
_questionFeedRepository.Entities.Where(predicate);

复制代码

上面代码逻辑是根据条件动态生成LINQ查询条件,将Func类型的变量做为参数传给Where方法。ide

实际上Where要求的参数类型是:Expression<Func<TSource, bool>>。post

写代码时没注意这个问题,运行结果也正确。发布后,在SQL Server Profiler监测中,发现QuestionFeed对应的数据库表出现了全表查询,才知道这个地方的问题。性能

问题就是:url

将Func类型的变量做为参数传给Where方法进行LINQ查询时,Enitity Framework会产生全表查询,将整个数据库表中的数据加载到内存,而后在内存中根据Where中的条件进一步查询。spa

解决方法:code

不要用Func<TSource, bool>,用Expression<Func<TSource, bool>>。orm

复制代码

Expression<Func<QuestionFeed, >> predicate=;
 (type == )
{
    predicate = f => f.FeedID == id && f.IsActive == ;
}

{
    predicate = f => f.FeedID == id;
}
_questionFeedRepository.Entities.Where(predicate);
相关文章
相关标签/搜索