【发布时间】:2016-11-11 09:15:31
【问题描述】:
我目前正在使用带有 SQL Server 的 EFCore 1.1(预览版)。
我正在做我认为是 Order 和 OrderItem 表之间的简单 OUTER JOIN。
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 和 OrderItem 中的每一列,考虑到其中一个是大型 XML Blob,这是有问题的。
SELECT [order].[OrderId], [order].[OrderStatusTypeId], [order].[OrderSummary], [order].[OrderTotal], [order].[OrderTypeId], [order].[ParentFSPID], [order].[ParentOrderId], [订单].[PayPalECToken],[订单].[PaymentFailureTypeId] ....
...[orderItem].[OrderId], [orderItem].[OrderItemType], [orderItem].[Qty], [orderItem].[SKU] FROM [Order] AS [order] LEFT JOIN [OrderItem] AS [orderItem] ON [order].[OrderId] = [orderItem].[OrderId] ORDER BY [订单].[订单 ID]
(这里没有显示更多的列。)
另一方面 - 如果我将其设为 INNER JOIN,则 SQL 与预期的一样,只有我的 select 子句中的列:
SELECT [order].[OrderDt], [orderItem].[SKU], [orderItem].[Qty] FROM [Order] AS [order] INNER JOIN [OrderItem] AS [orderItem] ON [order].[OrderId] = [orderItem].[OrderId]
我尝试恢复到 EFCore 1.01,但遇到了一些可怕的 nuget 包错误并放弃了。
不清楚这是实际的回归问题还是 EFCore 中的不完整功能。但在其他地方找不到任何关于此的更多信息。
编辑:EFCore 2.1 解决了很多分组问题以及 N+1 类型问题,即为每个子实体进行单独查询。事实上,表演给我留下了深刻的印象。
3/14/18 - 不推荐 EFCore 的 2.1 预览版 1,因为 GROUP BY SQL 在使用 OrderBy() 时存在一些问题,但它已在夜间构建和预览版 2 中得到修复。
【问题讨论】:
-
希望这会在 1.1 最终版本中得到修复,但不幸的是它没有:-(
-
@IvanStoev 真希望他们能更清楚地说明它本质上是未完成的软件。他们称之为 1.1,但实际上是 0.9。期待 1.2(或者我喜欢称之为 1.0):-)
-
更新:在 github 上看到了一些关于 GroupBy 下一个版本的进展的有希望的注释 :-) 包括一个承诺,它修复了许多这样的问题 :-)
-
我完全同意你的看法。我以前从未见过 MS 甚至测试版发布过这样的东西。看起来开源正在开启新的(坏的)实践。但我确信 EF Core 开发人员知道这一点。管理层很可能正在推动(因为 ASP.NET Core 堆栈),当然营销永远不会允许将其称为“未完成的软件”。是的,文档的Compare EF Core & EF6.x 部分有几句话,特别是Which One Is Right for You...
-
...部分,仅此而已,并且没有为开始使用 EF Core 时遇到的所有问题和错误提供足够的详细信息。根据我的经验,目前
entity-framework-coreSO 标签中 95% 以上的帖子都是由软件中的错误引起的。
标签: entity-framework entity-framework-core