2012-01-16 8 views
8

私は、次のLINQクエリ持っている:私はカウントを取得するために.Countを行うことができないとして、クエリが1つのレコードの を返さなかった場合LINQのFirstOrDefault

Manager mngr = (from tr in DataContext.Manager 
        where tr.Name = "Jones").FirstOrDefault(); 

はどのように確認することができます。

+3

FirstOrDefaultメソッドのドキュメントを参照してください。結果がない場合は、データ型のデフォルトを戻します。 * 1つ以上のレコードがクエリ条件を渡す必要がある場合は、代わりにSingleOrDefaultを使用します。 –

答えて

14

まず、有効なクエリではありません。クエリの構文(from blah in blah ...)を使用する場合は、select句が必要です。あなたのクエリにFirstOrDefault()を呼び出すと、クエリまたはタイプ(この場合は、最も可能性の高いnull)のデフォルト値の最初の結果が返されます、あなたの質問に答えるために

var manager = 
    (from n in DataContext.Manager 
    where n.Name == "Jones" 
    select n).FirstOrDefault(); 

:それはより多くのようにする必要があります。あなたがしようとしているものについては、クエリが複数の結果を含む可能性があるため、これは適切な使用ではありません。

クエリで1つの結果しか返さないことを確認する場合は、代わりにSingleOrDefault()メソッドを使用する必要があります。これは、クエリによって生成された1つの項目、または空の場合はデフォルト値nullを返します。複数の項目がある場合は例外をスローします。

例外をスローしたくない場合は、最初の2つの結果をリストにスローして、それが1つしかないことを確認する方が簡単かもしれません。

var managers = 
    (from m in DataContext.Manager 
    where m.Name == "Jones" 
    select m).Take(2).ToList(); 
if (managers.Count == 1) 
{ 
    // success! 
    var manager = managers.First(); 
    // do something with manager 
} 
else 
{ 
    // error 
} 
+0

私がしたやり方は、(mngr!= null){..私たちはリース1のレコードを持っていることを知っています} –

+0

**正確に**一つのレコードを持っていることを確認する.Single()もあります – PPC

+0

- 結果をリストに投げてカウントすることが適切な解決策であることを示唆している。大きな結果セットを作成する場合や、すべてのデータを取得するために大きなテーブルをトラバースする必要がある場合は、非常に問題があります。 FirstとSingleの両方は、提案で複製できないバックエンドの最適化を行います。 –

0

拡張メソッドSingleOrDefaultを使用すると、クエリで1つの結果しか返さないことを表現できます。

Manager manager = (from tr in DataContext.Manager 
        where tr.ID = "2323").SingleOrDefault(); 

それはあなたが0の結果以上より1

0

レコードをカウントしたい場合は、 FirstOrDefaultせずにクエリの結果をカウントを得たかどうかはわかりませんが。

var mngr = (from tr in DataContext.Manager 
       where tr.ID = "2323") 
if(mngr.Count() == 0) 
    .... 
else 
    Manager manager = mngr.First(); //No need for default since we know we have a record. 

特定のマネージャーを取得するには、引き続きmngrで最初またはデフォルトを実行できます。

0

あなたはwhere条件のIDを使用しています。このクエリでは1つの結果しか返されていないことが既に保証されているはずです。

問題が解決しない場合は、FirstOrDefault()の使用方法をMSDN titleから確認してください。

  int[] numbers = { }; 
      int first = numbers.FirstOrDefault(); 
      Console.WriteLine(first); 

      /* 
      This code produces the following output: 

      0 
      */