有人可以告诉我在带有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语句,并且立即返回数据。
答案 0 :(得分:1)
如评论中所述:
.Where()确实期望Expression<Func<T,bool>>
,而您的谓词似乎是Func<T,bool>
类型。 (大概)禁止EF将其转换为SQL查询,这意味着它将在本地(在基础ICollection实现上)进行评估。
在此注意,请注意,.include上的WHERE条件不能按您预期的那样工作,因为生成的SQL将联接两个映射表并评估结果表上的条件,而不是联接具有第二个表的精简结果集的映射表。该查询运行速度更快的原因是:1。DBS可能由于条件而使用索引; 2。要实现的行数较少。