1. ホーム
  2. c#

[解決済み】FluentとQuery Expression - どちらか一方にメリットがあるのでしょうか?

2022-04-03 03:31:05

質問

LINQは、ジェネリックス以来の.NETの最大の改良点の1つで、時間とコードの行数を大幅に節約してくれます。 しかし、流暢な構文は、私にとって、クエリ式の構文よりもはるかに自然なものに思えます。

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

この2つの違いや、どちらか一方が優れているということはあるのでしょうか?

解決方法は?

どちらが良いというわけではなく、それぞれ異なるニーズに対応しています。クエリ構文が威力を発揮するのは 複数の範囲変数 . これは、3つの状況で発生します。

  • letキーワードを使用する場合
  • 複数のジェネレータがある場合( から 節があります)
  • 結合を行う場合

以下はその例です(LINQPadのサンプルより)。

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

では、同じことをメソッド構文で比較してみましょう。

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

一方、メソッド構文は、クエリ演算子をすべて利用でき、単純なクエリであればより簡潔に行うことができます。クエリ構文とメソッド構文を混在させることで、両者の長所を活かすことができます。これは、LINQ to SQLクエリでよく行われます。

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };