gpt4 book ai didi

c# - Entity Framework 不将 Where 子句作为 WHERE 子句发送到 SQL Server

转载 作者:太空狗 更新时间:2023-10-29 18:19:30 24 4
gpt4 key购买 nike

我有一个包含站点的简单数据库,每个站点都有一堆帖子。

我正在尝试获取某个站点的所有“公共(public)”帖子(我有一个名为 site 的变量,它已经是 EF 带来的一个实例)

首先显而易见的是:

  var posts = from post in site.Posts
where post.Public == true
orderby post.PublicationTime descending
select post;

这给了我想要的东西,但是查看 SQL Server Profiler,WHERE 只过滤公共(public)字段,而不是站点。事实上,在 SQL Server 中运行 Profiler 捕获的查询确实会带回所有站点的所有帖子(这显然稍后会在 ASP.Net 端被过滤)。

然后我尝试了:

  var posts = from post in db.Posts
where post.Site == site && post.Public == true
orderby post.PublicationTime descending
select post;

同样的结果。

我是不是在做一些根本上很愚蠢的事情?
Entity Framework 是否始终在客户端进行过滤?

谢谢!
丹尼尔

最佳答案

您需要了解 LINQ to Entities 和 LINQ to Objects 之间的区别。在使用 Entity Framework 时,跟踪这一点非常重要。

当您对 ObjectContext 发出查询时,您就是在 LINQ to Entities 中工作。这将返回一个 IQueryable。只要您使用的是 IQueryable 类型的变量,就可以使用 LINQ API 进一步组合查询,当您最终枚举结果时,它将转换为 SQL。

但是你说:

(I have a variable called site that is already an instance brought by EF)

此处您查询的是对象的属性,因此您使用的是 LINQ to Objects,而不是 LINQ to Entities。这意味着您的查询具有不同的提供程序,并且不会转换为 SQL。

关于您的第二个查询:

var posts = from post in db.Posts
where post.Site == site && post.Public == true
orderby post.PublicationTime descending
select post;

EF 不允许您对 L2E 中的实例进行身份比较。您必须改为比较 key 。尝试:

var posts = from post in db.Posts
where post.Site.Id == site.Id && post.Public
orderby post.PublicationTime descending
select post;

顺便说一句,我将 post.Public == true 更改为 post.Public。我认为它更清洁。

关于c# - Entity Framework 不将 Where 子句作为 WHERE 子句发送到 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2241908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com