web-dev-qa-db-ja.com

Entity Framework .Whereメソッドチェーン

コンテキストを照会するこれら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ステートメント。チェーンすることができるとは思わない。他のステートメントよりも好む理由、またはより良い/より効率的なシナリオがあるのか​​?

28
e36M3

どちらも同じ結果になります(私が間違っていない場合)が、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);
41
Justin Niessner

私の推測では、IQueryableで作業している限り(おそらくコンテキストコレクションがそうであるように)、連鎖拡張機能と完全な述語節を使用しても同じことが実現します。これは、IQueryableが遅延実行を許可するため、本質的に同じSQLが舞台裏で生成されるためです。

2
dotariel

コードをデバッグして、それぞれの結果として生成されるSQLを確認できます。私はそれが同じクエリになると想像します。

0
skaz