1

私はEFに小さな問題があります。大きなテーブルに対してクエリを実行していますが、非常に時間がかかります。原因はわかったと思いますが、解決策が見つかりません。

私の LINQ クエリは次のようになります。

IEnumerable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH);
return o.Any() ? o.FirstOrDefault() : null;

これで where 句を含む SQL クエリが生成されると思いますが、実際に生成されるのは次のとおりです。

SELECT 
[Extent1].[ITEMID] AS [ITEMID], 
[Extent1].........
snap 10 columns
FROM [dbo].[TABLE] AS [Extent1]

where句とselect(1列だけを選択しようとしています)は、列挙後に実行されます。私がやりたいことは、where 句を使用して SQL クエリを生成し、1 つの列のみを選択することです。

私は何を間違っていますか?

4

2 に答える 2

1

オブジェクトの型を作成しているためIEnumerable<string>、EF は最初の行でこのクエリを実行します。次にAny()、またはFirstOrDefault()メモリセットで実行されます。linq ステートメントの作成を「続行」し、最後にクエリを実行する場合。と一緒に行くだけIQueryable<T>です。

IQueryable<string> o = (from P in Table where P.ITEMID == itemid && P.IMAGESIZE == size select P.PATH);
return o.SingleOrDefault();   

しかし、Ryan Bennett が提案したように、使いやすいです。

return Table.Where(p => p.ITEMID == itemid && P.IMAGESIZE == size).SingleOrDefault().PATH;
于 2012-06-04T13:52:43.443 に答える
0
return table.FirstOrDefault(P => P.ITEMID == itemid && P.IMAGESIZE == size); 

これがあなたが成し遂げようとしていることだと思います。これにより、SQLにwhere句が与えられ、すぐにレコードまたはnullが返されます。

于 2012-06-04T13:55:26.413 に答える