将 Include 与 Func 谓词一起使用时,使用 Entity Framework 的慢查询

Slow query with Entity Framework when using Include with Func predicate

有人能告诉我如何在 linq to sql 查询中使用 entity framework 和 include

时如何在 where 子句中包含一个子句吗?

我有以下查询:

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

其中谓词定义如下:

t => t.id == myId

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

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

更新-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 语句并立即返回数据。

如评论中所述:

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

在此说明中,请注意 .Include 的 WHERE 条件并不像您预期​​的那样起作用,因为生成的 SQL 将加入两个映射的 table 并计算结果 table 的条件,而不是将映射 table 与第二个 table 的缩减结果集连接起来。此查询运行速度更快的原因是 1. DBS 可能能够根据条件使用索引,以及 2. 要具体化的行数较少。