2011-06-23 6 views
0
Stream stream = SystemStreams.Where(st => st.getName().Equals(s.OBJECT_NAME)) 
           .Single(); 

where節の条件が満たされても、すべてのレコードが読み込まれます。そのために実際には遅くなっています。誰も助けることができますか?where節の条件が満たされていても、C#でwhere条件が満たされた後は、SQL文からコントロールを取り出す方法を教えてください。

+0

ORMを使用していますか? –

答えて

2

だけではなく、FirstOrDefault()を使用します。

Stream stream = SystemStreams.Where(st => st.getName().Equals(s.OBJECT_NAME)) 
          .FirstOrDefault(); 

かさえ短い:一致が見つからない場合FirstOrDefault()nullを返すこと

Stream stream = SystemStreams.FirstOrDefault(st => st.getName().Equals(s.OBJECT_NAME)) 

注意、一致したそれ以外の場合は最初の項目を。コメントへの応答で

編集:私はSingle()見てきましたSQLプロバイダで

SELECT TOP 2 bar,baz from foo where <some condition> 

に変換され、これは一つだけの一致がある場合、あなたはまだすべてのを比較しなければならないことを意味しますを記録して、2番目の一致を試してみてください。一致するものが1つ以上ある場合はSingle()が例外をスローする必要があるため、これが必要です。一方、

FirstOrDefault()は、これはそれが最初の試合後に停止し、それに応じてnullまたはレコードを返すことができることを意味し

SELECT TOP 1 bar,baz from foo where <some condition> 

に変換されます。

+0

あなたは答えに私を打ち負かしました:) – PedroC88

+0

これが正しいと確信していますか? st.getName()メソッドはどのようにSQLに変換されますか?フェッチしたレコード全体を一度しか評価できません。 –

+0

これはOPのコードとは異なることに注意してください。同じ 's.OBJECT_NAME'を持つ複数の' st'がある場合、彼は投げるでしょう。あなたのものは気にしないで最初のものをつかむでしょう。 –

1

使用SystemStreams.FirstOrDefault(クエリ)の代わりに、.Where

0

そのおそらくあなたの機能のgetName()は、SQL文の表現から変換することはできません、全体のレコードをフェッチする必要があり、where句ので、ローカルで評価されます(データベースではありません)。

関連する問題