我目前正在将 EFCore 1.1(预览版)与 SQL Server 结合使用。
我正在做我认为是一个简单的 OUTER JOIN 之间的事情Order
and OrderItem
table.
var orders = from order in ctx.Order
join orderItem in ctx.OrderItem
on order.OrderId equals orderItem.OrderId into tmp
from oi in tmp.DefaultIfEmpty()
select new
{
order.OrderDt,
Sku = (oi == null) ? null : oi.Sku,
Qty = (oi == null) ? (int?) null : oi.Qty
};
返回的实际数据是正确的(我知道早期版本存在 OUTER JOINS 根本不起作用的问题)。然而 SQL 很糟糕并且包含了中的每一列Order
and OrderItem
考虑到其中一个是大型 XML Blob,这是有问题的。
SELECT [订单].[OrderId], [订单].[OrderStatusTypeId],
[订单].[OrderSummary]、[订单].[OrderTotal]、[订单].[OrderTypeId]、
[订单].[ParentFSPID], [订单].[ParentOrderId],
[订单]。[PayPalECToken],[订单]。[PaymentFailureTypeId] ....
...[orderItem].[OrderId]、[orderItem].[OrderItemType]、[orderItem].[Qty]、
[orderItem].[SKU] FROM [订单] AS [订单] LEFT JOIN [OrderItem] AS
[orderItem] ON [order].[OrderId] = [orderItem].[OrderId] ORDER BY
[订单].[订单ID]
(还有更多列未在此显示。)
另一方面 - 如果我将其设置为 INNER JOIN,则 SQL 与预期一致,仅包含我的 select 子句中的列:
SELECT [订单].[OrderDt]、[orderItem].[SKU]、[orderItem].[Qty] FROM
[订单] AS [订单] INNER JOIN [OrderItem] AS [orderItem] ON
[订单].[订单 ID] = [订单项].[订单 ID]
我尝试恢复到 EFCore 1.01,但遇到了一些可怕的 nuget 包错误并放弃了。
不清楚这是实际的回归问题还是 EFCore 中的不完整功能。但在其他地方找不到任何有关此的进一步信息。
编辑:EFCore 2.1 解决了许多分组问题以及 N+1 类型问题,其中为每个子实体进行单独的查询。事实上,对表演印象非常深刻。
2018 年 3 月 14 日 - 不建议使用 EFCore 2.1 预览版 1,因为 GROUP BY SQL 在使用 OrderBy() 时存在一些问题,但已在夜间构建和预览版 2 中修复。