2011-12-13 10 views
1

私は顧客テーブルからいくつかのフィールドを選択するlinqクエリを持っています。LINQクエリとエンティティフレームワークの組み合わせC#

Func<IQueryable<T>, IQueryable<T>>.Invokeを使用する複数のフィルタが適用されます。

元のクエリは基本的にselect * from customerです。

フィルタ方式は、本質的であるselect top 10

出力SQLは、私の顧客の表は、このクエリはSSMSで実行するのに約7秒を取るようになり1,000,000以上の行を持つselect top 10 from (select * from customer)

です。 SSMSで実行して出力SQLをselect top 10 from (select top 10 * from customer)に変更すると、クエリは即座に実行されます(期待どおり)。

LINQがこれらをうまく組み合わせない原因を知っている人がいたら、私が実装できるベストプラクティス/回避策があるかどうかは疑問です。

私の実際のコードは選択されていないことに注意してください*いくつかのフィールドを選択していますが、それ以上の複雑なものはありません。

私は、エンティティフレームワーク(どのバージョンかわからない)

編集してSQL Server 2008およびMVC 3を使用しています:私は追加する必要があり、それはすべての方法のIQueryableのですが、何も最後まで、その結果として評価されていません長い実行はその単一の行に限定されます。

+0

この問題は解決しましたか? –

+0

私は覚えていない、私はデータベースに多くのインデックスを追加したと思う、それは非問題になった – NibblyPig

+0

それはクールだ。あなたが何か作業と大丈夫を実行している限り、それは主なものです。 –

答えて

0

なぜ最適化されていないのか分かりません。

フィルタ法は、本当に、あなたはこのようにそれを行うことができるはずSELECT TOP 10と同等である場合:select top 10 * from customerではなく、あなたがになってしまった、より複雑なものに解決でしょう

return query.Take(10); 

これが機能しない場合は、もう少し詳細が必要になるでしょう。

EDIT:あなたは何とか大丈夫だろうTake(n)を使用することができるのであれば

SELECT TOP (10) [t1].[col1], [t1].[col2] 
FROM (
    SELECT TOP (10) [t0].[col1], [t0].[col2] 
    FROM [DataItem] AS [t0] 
    ) AS [t1] 

DataItems.Take(10).Take(10) 

あなたはこのSQLを得るでしょう:あなたはLINQでこれを行う場合は、明確にします。

関連する問題