注意すべき微妙な違いが 1 つあります。次のクエリを検討してください (ことわざの NorthWind を使用)。
Customers.Where(delegate(Customers c) { return c.City == "London";});
Customers.Where(c => c.City == "London");
1 つ目は匿名デリゲートを使用し、2 つ目はラムダ式を使用します。両方の結果を評価すると、同じことがわかります。しかし、生成された SQL を見ると、まったく別のことがわかります。最初の生成
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [Customers] AS [t0]
一方、2番目は生成します
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [Customers] AS [t0]
WHERE [t0].[City] = @p0
最初のケースでは、where 句がデータベースに渡されていないことに注意してください。どうしてこれなの?コンパイラは、ラムダ式が式ツリーとして保持できる単純な単一行の式であると判断できますが、匿名デリゲートはラムダ式ではないため、 としてラップできませんExpression<Func<T>>
。最初のケースの結果として、Where 拡張メソッドに最適なのは、Expression<Func<T, bool>>
.
この時点では、匿名デリゲートはほとんど役に立ちません。それはより冗長で柔軟性に欠けます。一般に、匿名デリゲート構文よりも常にラムダ構文を使用し、解析可能性と構文の簡潔さを考慮することをお勧めします。