2012-01-20 3 views
1

フィルタのリストを使用してlinqクエリをフィルタリングする必要があり、そのためにcontainsメソッドを使用する予定です。だから、このようなものになるでしょう。Linqの性能が含まれています

List<string> filter = new List<string>(); 
filter.Add("foo"); 
filter.Add("bar"); 
//Additional filters go here, max of about 10 filters 
var test = dbcontext.books.Where(x => filter.Contains(x.name)).ToList(); 

このクエリの背後にあるテーブルには、多くのレコード(500,000)、PK IDフィールド、およびクエリ対象のフィールドのインデックスがあります。

私の質問は、このルートを下る前に、このクエリのパフォーマンスが受け入れられると思っていますか、そういった大きなデータセットで別のアプローチを使用する必要がありますか?

+0

「許容可能なパフォーマンス」を定義します。 – Oded

+0

Linq2ObjectsまたはLinq2SQL?後者の場合、SQLサーバーはそれを最適化する必要があります。前者はそれに依存するが、一般的にはそれよりも遅い。 – leppie

+1

@leppie EFが最も簡単なクエリでさえもできることを常に驚かせています。 SQL GeneratorにRube Goldbergレイヤーがあることを誓っています。 –

答えて

6

はい、問題ありません。それはちょうど@p0 = 'foo'@p1 = 'bar'

select x.* from [books] x where x.name in (@p0,@p1) 

に変換します。 nameが索引付けされている限り、それはうまくいくはずです。しかし、filterが非常に大きくなると、もっと面白くなります。 10の項目はうまく聞こえる。私は暗黙のうちにそれがないと仮定していますすべての500,000 - しかし、元気な数に制限されます。そうでない場合は、.Take(number)の制限を追加することを検討してください。

これが問題であれば、それを測定してください。 SQLトレースを実行するか、プロファイリングツールを使用するのは簡単です。

+0

生成されたSQLをIQueryableから取得する方法:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/6df9599f-c165-4a0e-9b92-ca58a8fc3816/ –

+1

@TetsujinnoOniもっと簡単にMiniProfilerを使用してください:p –

+0

完璧なおかげで! – Hoody

0

他の理由ですべてのデータがすでにメモリに格納されている場合は、このアプローチを使用することができます。そうしないと、500kのレコードを一度にメモリにロードしないので、データベースがおそらくもっと良いでしょう。

select * from Books b where b.name IN {"foo", "bar", ...} 
+1

OP *が500,000レコードを返していることは明らかではありません。 'LIKE'を使うと意味が変わり、*確かに*パフォーマンスが変わります。 –

+0

あなたは正しいです。私は彼が{"foo"、 "bar"}、tyのセットに含まれている名前ではなく、fooまたはbarという単語を含む名前にしたいと思った – JustinDanielson

関連する問題