2011-12-15 9 views
8

次の2つのLINQステートメントの違いを教えてもらえますか?LINQ - 異なる構文スタイル、異なる結果ですか?

var ChkUnique = DB.BusinessFile.FirstOrDefault(c => c.ROCNo == txtBoxID.Text); 

var ChkUnique = from c in DB.BusinessFile 
       where c.ROCNo == (string)txtBoxID.Text 
       select c; 

ChkUnique != nullリターンマッチが発見され、後者はtrueとなぜこれが起こっている私は理解できないことはできないトップ1のためfalse

私はLINQを初めて使っているので、基本的なものは見逃していたかもしれませんが、現時点ではナットを運転しています。

+0

このように、最初のものと等価なものを作ることができます: 'var ChkUnique =(c.ROCNo ==(string)txtBoxID.Text select c).FirstOrDefault();' – phoog

答えて

10

2番目のコードは、呼び出し元のクエリを表すオブジェクトを返しています。 nullになることはありません。一度列挙されても、空のコレクションになる可能性があります。 (まだヌルではありません)

最初のものはFirstOrDefaultを呼び出しています。これは単一の結果を単一の変数に強制し、結果がない場合はnullを返します。 FirstOrDefaultの代わりにWhereを実行した場合は、同じ結果が得られます。

+1

Gotcha!ありがとう:) – Permas

+1

また、後者を同じ '(DB.BusinessFileのcから)終了すると、c.ROCNo ==(文字列)txtBoxID.Text c).FirstOrDefault()'が選択されます。読みやすいように選択してください! – Independent

1

最初の文はExtension Methodを使用し、2番目の文はLINQ Query Expressionです。

最初のメソッドFirstOrDefaultでは、シーケンスの最初の要素を返します。シーケンスに要素が含まれていない場合はデフォルト値を返します。ここではオブジェクトを処理していますので、結果に要素が含まれていない場合は、デフォルトの戻り値はNULLです。

また、2番目のステートメントは常にIEnumerable<T>コレクションタイプの値を返し、nullにはなりません。コレクションのCountプロパティを使用して、コレクションにアイテムが含まれているかどうかを確認できます。

最初のステートメントで拡張メソッド.Where()を使用すると、2番目のステートメントに相当します。

詳細情報と相違点については、指定したリンクを確認してください。