コンテキストを照会するこれら2つの方法に何か違いはありますか?
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId)
.Where(f => f.AnotherId == anotherId)
.FirstOrDefault();
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId && f.AnotherId == anotherId)
.FirstOrDefault();
AND条件を達成するには、連鎖は完全にうまくいくようです。 ORステートメント。チェーンすることができるとは思わない。他のステートメントよりも好む理由、またはより良い/より効率的なシナリオがあるのか?
どちらも同じ結果になります(私が間違っていない場合)が、2番目の方が読みやすく、元の意図をよりよく示しています。
更新
LINQPadを使用して上記のステートメントを検証しました。実際、両方のクエリは同じSQLを生成します。
例えば:
context.SomeTable.Where(c => c.ParentId == null)
.Where(c => c.Name.Contains("F"))
.Select(c => c.Name);
生産物:
SELECT [t0].[Name]
FROM [SomeTable] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL)
これは、次のものによって生成されるのと同じSQLです。
context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F"))
.Select(c => c.Name);
物事をもう少し圧縮することもできます(上記と同じ理由で私はそれが好ましいと思います):
var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId
&& f.AnotherId == anotherId);
私の推測では、IQueryable
で作業している限り(おそらくコンテキストコレクションがそうであるように)、連鎖拡張機能と完全な述語節を使用しても同じことが実現します。これは、IQueryable
が遅延実行を許可するため、本質的に同じSQLが舞台裏で生成されるためです。
コードをデバッグして、それぞれの結果として生成されるSQLを確認できます。私はそれが同じクエリになると想像します。