将 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. 要具体化的行数较少。
有人能告诉我如何在 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. 要具体化的行数较少。