实体框架和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语句中的子句。
非常感谢任何帮助/澄清:)
答案 0 :(得分:3)
正如Nicholas已经注意到的,看起来像在FeedItems
属性中执行的查询(可能您正在返回List
或IEnumerable
),并且从数据库返回整个项目列表。之后,您将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]