实体框架.Any不生成预期的SQL WHERE子句

时间:2013-04-18 21:35:07

标签: entity-framework entity-framework-4 linq-to-entities

实体框架和Linq-To-Entities真的给了我一些麻烦。我有一个相当简单的查询:

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

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

但生成的SQL只会丢弃.Any条件并请求feed对象的所有FeedItems,这可能是数千条记录,这是浪费Network bandwith。似乎是实际的。任何比较都是在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语句中的

子句。

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

1 个答案:

答案 0 :(得分:3)

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

当您将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]