【发布时间】:2018-10-11 20:17:15
【问题描述】:
我想获取客户 ID 列表和该客户下的订单数量。过滤条件为:
- 总额不超过 10 美元的订单将不计算在内。
- 未下至少 3 个订单(每个订单总额为 10 美元或更多)的客户将不会被列出。
所以,我会在 SQL 中执行以下操作:
SELECT customerID, COUNT(*)
FROM Orders
WHERE orderTotal > 10
GROUP BY customerID
HAVING COUNT(*) > 2
在 EF 中,我认为这可以表示为:
dbContext.Order
.Where(o => o.orderTotal > 10)
.GroupBy(o => o.customerID)
.Where(g => g.Count() > 2)
.ToList();
但这会产生以下 SQL,它使用派生表和连接,而不是简单地使用 HAVING 子句。我认为这在性能方面远非最佳。是否有更好的方法在 EF 中制定案例,以便翻译后的查询将使用 HAVING 子句?
SELECT
[Project1].[C1] AS [C1],
[Project1].[customerID] AS [customerID],
[Project1].[C2] AS [C2],
[Project1].[ID] AS [ID],
FROM ( SELECT
[GroupBy1].[K1] AS [customerID],
1 AS [C1],
[Extent2].[ID] AS [ID],
CASE WHEN ([Extent2].[storeID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
FROM (SELECT
[Extent1].[customerID] AS [K1],
COUNT(1) AS [A1]
FROM [dbo].[Orders] AS [Extent1]
WHERE [Extent1].[orderTotal] > cast(10 as decimal(18))
GROUP BY [Extent1].[customerID] ) AS [GroupBy1]
LEFT OUTER JOIN [dbo].[Orders] AS [Extent2] ON ([Extent2].[orderTotal] > cast(10 as decimal(18))) AND (([GroupBy1].[K1] = [Extent2].[customerID]) OR (([GroupBy1].[K1] IS NULL) AND ([Extent2].[customerID] IS NULL)))
WHERE [GroupBy1].[A1] > 2
) AS [Project1]
ORDER BY [Project1].[customerID] ASC, [Project1].[C2] ASC
【问题讨论】:
-
您是遇到性能问题还是只是猜测?
标签: c# sql sql-server entity-framework linq