使用Include with Func谓词时,使用Entity Framework的查询缓慢

时间:2019-03-26 10:52:34

标签: c# entity-framework linq-to-sql entity-framework-6

有人可以告诉我在带有include的实体框架中如何在where查询中包含linq to sql子句

我有以下查询:

var test = this.MyContext.MyData
           .Include("MoreData")
           .Include("EvenMoreData")
           .Where(predicate)

谓词的定义如下:

t => t.id == myId

问题是,当我通过SQL Server Profiler检查它时,它似乎未在SQL查询中包括Where子句,这导致我的查询非常慢,因为它返回450k +条记录,而不是7条记录我的具体例子。

关于如何在where生成的查询中包含EF子句的任何想法。

UPDATE-1:

奇怪,但是在替换谓词变量集时如下:

private MyObject Get(Func<MyObject, bool> predicate)

...

this.UnitOfWork.MyObject.Get(t=>t.id == myId);

作者

var test = this.MyContext.MyData
       .Include("MoreData")
       .Include("EvenMoreData")
       .Where(t=>t.id = 1234)

其中包含where语句,并且立即返回数据。

1 个答案:

答案 0 :(得分:1)

如评论中所述:

.Where()确实期望Expression<Func<T,bool>>,而您的谓词似乎是Func<T,bool>类型。 (大概)禁止EF将其转换为SQL查询,这意味着它将在本地(在基础ICollection实现上)进行评估。

在此注意,请注意,.include上的WHERE条件不能按您预期的那样工作,因为生成的SQL将联接两个映射表并评估结果表上的条件,而不是联接具有第二个表的精简结果集的映射表。该查询运行速度更快的原因是:1。DBS可能由于条件而使用索引; 2。要实现的行数较少。