1. ホーム
  2. .net

[解決済み】LINQ SingleとFirstの比較

2022-04-18 04:37:54

質問

LINQです。

を使う方が効率的なのでしょうか? Single() 演算子を First() を返すことが確実な場合、そのクエリーは 単一のレコード ?

違いはあるのでしょうか?

どのように解決するのですか?

Singleレコードを期待する場合は、常にコードで明示するのがよいでしょう。

他の人が、どちらかを使う理由を書いているのは知っていますが、私は、以下のような場合に、どちらかを使ってはいけないという理由を説明しようと思いました。 意味 もう一方は

注:私のコードでは、一般的に FirstOrDefault()SingleOrDefault() が、それはまた別の問題です。

例えば、以下のようなテーブルがあるとします。 Customers を使用し、異なる言語でのコンポジットキー( ID , Lang ):

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 ).First();

上記のコードでは、ロジックエラーが発生する可能性があります(追跡は困難です)。これは複数のレコードを返しますが(顧客のレコードが複数の言語で書かれていると仮定して)、常に最初のものだけを返します。これは予測不可能です。

を返すことを意図しているので、Single Customer 使用 Single() ;

次のようにすると、例外が発生します(この場合、例外が発生することが望ましいのですが)。

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 ).Single();

そして、自分のおでこを叩いて、こう言うのです。おっと! 言語フィールドを忘れていた! 以下が正しいバージョンです。

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 && c.Lang == "en" ).Single();

First() は、次のような場面で有効です。

DBContext db = new DBContext();
NewsItem newsitem = db.NewsItems.OrderByDescending( n => n.AddedDate ).First();

これは1つのオブジェクトを返し、ソートを使用しているので、返されるのは最も新しいレコードになります。

使用方法 Single() のように、常に1レコードを返すように明示的に指定すると、ロジックエラーを回避することができます。