少なくとも 2 つの注文がある顧客を選択することを想像してください。これを Entity Framework を使用して効率的に表現するにはどうすればよいでしょうか?
context.Customers.Where(c => c.Orders.Count() > 1)
この一見無害な式は、次のような SQL になります。
SELECT
[Project1].[Id] AS [Id]
FROM ( SELECT
[Extent1].[Id] AS [Id],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[Orders] AS [Extent2]
WHERE [Extent1].[Id] = [Extent2].[UserId]) AS [C1]
FROM [dbo].[Customers] AS [Extent1]
) AS [Project1]
WHERE [Project1].[C1] > 1
SQL Server は、各エンティティの結合全体で完全なカウントを計算するのを避けるほどスマートですか? それとも、別のアプローチを使用する必要がありますか?
クエリを実行して応答時間をテストするだけでなく、これをどのようにテストしますか?
私が検討したその他のクエリ式を次に示します。簡単なテストでは、それらの間のパフォーマンスの違いはほとんど示されません。
context.Customers.Where(c => c.Orders.Take(2).Count() > 1)
context.Customers.Where(c => c.Orders.OrderBy(o => o.Id).Skip(1).Any())
context.Orders.GroupBy(l => l.Customer).Where(g => g.Count() > 1).Select(g => g.Key)