Linq 到实体联合生成到联合表的内部联接
本文关键字:内部 实体 Linq | 更新日期: 2023-09-27 18:33:14
我遇到了一个让我困惑的问题。 当我尝试将两个表合并在一起时,对第二个表的查询正在生成一个内部联接回第一个表。 使用联合的全部意义在于,如果记录存在于任一表中,则返回结果,但如果记录位于第二个表中,而不是第一个表中,则此内部联接会导致其失败。
我做了一些规模小得多的测试,看看我是否发疯了,但事实似乎并非如此。
我有两个表,OrderDetails和OrderDetailHistory 。 背景故事:一段时间后,记录将从详细信息表中删除并放入历史记录表中。 字段和一切都完全相同。 事实上,这是 OrderDetailHistory 的实体:
public partial class OrderDetailsHistory : OrderDetail { }
所以,首先,我写了一个小的测试查询,它很好地代表了我所看到的内容。
var test = this.context.OrderDetails
.Select(x => x.Descr)
.Union(this.context.OrderDetailsHistories
.Select(x => x.Descr))
.Where(x => x == "wat")
.ToList();
生成此查询:
SELECT
[Distinct1].[C1] AS [C1]
FROM ( SELECT DISTINCT
[UnionAll1].[Descr] AS [C1]
FROM (SELECT
[Extent1].[Descr] AS [Descr]
FROM [dbo].[OrderDetails] AS [Extent1]
WHERE N'wat' = [Extent1].[Descr]
UNION ALL
SELECT
[Extent3].[Descr] AS [Descr]
FROM [dbo].[OrderDetails_History] AS [Extent2]
INNER JOIN [dbo].[OrderDetails] AS [Extent3] ON ([Extent2].[Order_No] = [Extent3].[Order_No])
WHERE N'wat' = [Extent3].[Descr]) AS [UnionAll1]
) AS [Distinct1]
哼? 为什么第二个选择语句甚至引用详细信息表? 当我使用连接时会发生什么? 同样的事情。 相交? 相同的内部联接。 好的,也许不是先联合,然后应用我的条件,我可以将条件应用于每个查询,然后只是合并结果。
怎么样?
var query1 = this.context.OrderDetails.Where(x => x.Descr == "wat").Select(x => x.Descr);
var query2 = this.context.OrderDetailsHistories.Where(x => x.Descr == "wat").Select(x => x.Descr);
var result = query1.Concat(query2).ToList();
生成几乎完全相同的查询! 有谁知道这里发生了什么? 我的期望是不是偏离了?
如果我扔一个.ToList(( 在上面的 query1 和 query2 语句的末尾,它的工作方式与我预期的完全一样,但随后我失去了在 sql 中进行分页的能力,最终拉下了太多的记录,而我们每页只显示 10 条。
任何帮助将不胜感激。
你用的是什么EF方法,我想首先是代码。但无论如何,你用错了它,或者你不知道它是如何工作的。当你从OrderDetail
继承你的OrderDetailsHistory
类时,它会说,OrderDetailsHistory
总是一个OrderDetail
。
因此,如果您想选择所有订单,您只需查询OrderDetail
并且还会有所有OrderDetailsHistory
实体:
this.context.OrderDetails
.Select(x => x.Descr)
.Where(x => x == "wat")
.ToList();
了解数据在数据库中的存储方式也很重要。您正在使用每个类的表 aproach - 阅读一些有关它的文章(例如 http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt (以了解它的工作原理,然后您还将了解为什么您的所有查询看起来"如此奇怪"......