2012-02-23 4 views
5

私はiQueryableを持っており、nullか値がないかどうかを知る必要があります。まあnullまたはcountを決定する最良の方法0

IQueryable<people> L = (from p in people 
         where p.lastname.Contains("y") 
         select p); 
if (L != null && L.Count() > 0) { 
    return "Something"; 
} else { 
    return "NOTHING"; 
} 

あなたがL.Count()を使用する場合には、より多くのリソースを使用します。より良い方法がありますか?何も使用しないものL.Count()

+3

'SingleOrDefault'を呼び出すと、' L'は 'IQueryable 'になりますか? – dtb

+0

あなたは正しいです、私は自分のコードに '.SingleOrDefault'を持っていませんでした。あなたの心の中でそれを編集してください。 – Kramer

+1

質問を編集するには、質問の下にある[編集](http://stackoverflow.com/posts/9414805/edit)リンクをクリックしてください。 – dtb

答えて

4

.Any()を使用することをお勧めします。彼らはほぼ同じ実装を持っているし、あなたが探しているものはおそらくされているよう

IQueryable<people> L = (from p in people 
         where p.lastname.Contains("y") 
         select p); 
if (L.Any()) { 
    return "Something"; 
} else { 
    return "NOTHING"; 
} 
+0

コード比較を行い、 '.Count'と' .Any'はほぼ同じでした。しかし、私は '.Any'が好きです。私はSQLの処理方法を確認していませんが、後でそれを行うことができます。ありがとう! – Kramer

+0

列挙型が空であるか、1つまたは2つの値しか持たない場合、または、ICollectionまたはArray(したがってCountまたはLengthプロパティを持つ)としても識別できるソースIEnumerableにメソッドが直接適用される場合は、Count ()はAny()とほぼ同じ動作をします。 Any()が本当に輝く場所は長いコレクションです。任意の()は常に実行されます(O(1))。一方、Count()は線形に実行されます(O(N))。どちらも、ほとんどのアルゴリズム測定では「高速」ですが、Any()は高速です。 – KeithS

+0

Linq to SQL、Entity Framework、および最近のNHibernateプロバイダはすべて、特別な、実行可能な方法で 'Any'を処理します。 LINQPadを使用して生成されたものの例を見ることができます。かなりクール。 – HackedByChinese

1

L.Any()L.FirstOrDefault()はかなりの両方が同じ性能を持っています。複数の結果がある場合、例外がスローされるため、SingleOrDefaultはおそらく意図的ではありません。それは、この一部を言って価値が

Performance of LINQ Any vs FirstOrDefault != null

は、プロバイダに依存します。 IQueryableは単に意図を意味します。 Linq2Sqlなんかあれば、L.Count()はもっと多くのリソースを要求するでしょう - 上記の行のSingleOrDefaultも必要ですが、あなたのヌルチェックは必要ですが、あなたの型が一致しないことを除いて...

Linqプロバイダに対してこのステートメントを実行している場合は、自分自身(またはAmazons、または他のLINQプロバイダ)を書いてください。 .Count()はプロバイダが何をしているかに応じてより高速になりますが、通常のMicrosoft Linq to SQL実装を使用します。

1

これは.ANYがtrueを返した場合のIQueryableを返す例です。それはデータベースには、2件のラウンドトリップを必要とするため、しかし、それはあまりにもineffecientかもしれない、.ANY方法

return people.Any(p => p.lastname.Contains("y")) ? "something" : "nothing"; 

の使用例。十分な時間と思考があれば、よりよい方法が書かれているはずです。

 return sis.Students.Any(p => p.LastName.Contains("y")) ? 
     people.Where(p => p.lastname.Contains("y")) : "nothing"; 
3

LはIQueryableにする必要がありますか?<> SingleOrDefaultを(使用することにより
)は、単一の人(人?)またはnull(人を推定するクラスである)他の

var result = (from p in people 
       where p.lastname.Contains("y") 
       select p).SingleOrDefault(); 

return result == null 
     ? "NOTHING" 
     : "Something"; 

次のようになります。使用したいか、どういうSingleOrDefault()ですFirstOrDefault()またはAny()を意味しますか?

LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteriaが役に立ちます。

hth、
アラン。

関連する問題