1

Entity Framework 和 Linq-To-Entities 真的让我有些头疼。我有一个相当简单的查询:

var result = feed.FeedItems.Any(ei => ei.ServerId == "12345");

feed 是我之前在来自同一上下文的单独查询中选择的单个 EF 实体。

但是生成的 SQL 只是丢弃了 .Any 条件,并请求提要对象的所有 FeedItems,这可能是数千条记录,这是对网络带宽的浪费。似乎是实际的。任何比较都是在 C# 中完成的:

exec sp_executesql N'SELECT [t0].[Id], [t0].[FeedId], [t0].[ServerId], [t0].[Published], [t0].[Inserted], [t0].[Title], [t0].[Content], [t0].[Author], [t0].[WebUri], [t0].[CommentsUri]
FROM [dbo].[FeedItem] AS [t0]
WHERE [t0].[FeedId] = @p0',N'@p0 int',@p0=3

我也试过:

!feed.FeedItems.Where(ei => ei.ServerId == "12345").Any();

但这并没有改变任何东西。即使删除 Any() 并查询完整的项目列表也不会更改查询。

我不明白......为什么这不像我预期的那样工作?应该有一个

WHERE ServerId == 1234

SQL 语句中的子句。

非常感谢任何帮助/澄清:)

4

1 回答 1

3

正如 Nicholas 已经注意到的那样,看起来像在FeedItems属性中执行的查询(可能您正在返回Listor IEnumerable)并且整个项目列表都是从数据库返回的。之后,您将申请Any内存收集。这就是您WHERE ServerId == 1234在 SQL 查询中看不到的原因。

当您应用于Any生成IQueryable的查询时,将如下所示:

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            [dbo].[FeedItem] AS [t0]
            WHERE [t0].[ServerId] = @p0
            ) THEN 1
        ELSE 0
     END) AS [value]
于 2013-04-18T21:40:01.843 回答