1

Entity Framework と Linq-To-Entities は、本当に頭の痛い問題です。私はかなり単純なクエリを持っています:

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

feed は、同じコンテキストからの別のクエリで以前に選択した単一の EF エンティティです。

しかし、生成された SQL は .Any 条件を破棄し、フィード オブジェクトのすべての FeedItems を要求します。これは、ネットワーク帯域幅の浪費となる数千のレコードになる可能性があります。実際のようです.Any比較は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

FeedItemsNicholas がすでに気付いているように、プロパティで実行されたクエリのように見え(おそらくListまたはを返している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 に答える