だから、ここに私のコードがあります:行ごとに比較して、IEnumerable
のメソッドの位置に注意してください。 ToList()
Customers.ToList().Where(m=>m.ID > 3).OrderByDescending(m=>m.Name).FirstOrDefault();
Customers.Where(m=>m.ID > 3).ToList().OrderByDescending(m=>m.Name).FirstOrDefault();
Customers.Where(m=>m.ID > 3).OrderByDescending(m=>m.Name).ToList().FirstOrDefault();
行ごとに見ていきましょう。
Customers.ToList().Where(m=>m.ID > 3)
.OrderByDescending(m=>m.Name).FirstOrDefault()
- .ToList() - 列挙可能
- .Where() - 列挙可能
- .OrderByDescending() - 列挙可能
- .FirstOrDefault - 列挙可能
Customers.Where(m=>m.ID > 3).ToList()
.OrderByDescending(m=>m.Name).FirstOrDefault()
- .Where() - クエリ可能
- .ToList() - 列挙可能
- .OrderByDescending() - 列挙可能
- .FirstOrDefault() - 列挙可能
Customers.Where(m=>m.ID > 3).OrderByDescending(m=>m.Name)
.ToList().FirstOrDefault()
- .Where() - クエリ可能
- .OrderByDescending() - クエリ可能
- .ToList() - 列挙可能
- .FirstOrDefault() - 列挙可能
さて、これらの SQL を順番に示します。
SELECT [t0].[ID], [t0].[名前] FROM [顧客] AS [t0] GO
SELECT [t0].[ID], [t0].[名前] FROM [顧客] AS [t0] WHERE [t0].[ID]
SELECT TOP (1) [t0].[ID], [t0].[名前] FROM [顧客] AS [t0] WHERE [t0].[ID] > @p0 ORDER BY [t0].[名前] DESC
line1 はコレクション全体を取得してワイヤを介して渡すようですが、 line3 は 1 つのエンティティのみを取得します。
SQL 出力によると、次のように推測できます。
line1: メモリを大量に消費するコード。より多くのデータがワイヤで渡されるため、より多くの帯域幅が必要です。
line3: データベースを多用するコード。回線で渡されるデータが少なくなるため、必要な帯域幅が少なくなります
コードの各行間で内部的に何が起こっているのか興味があります。それらは比較的似ており、まったく同じ結果が得られます。