【发布时间】:2014-12-04 23:27:15
【问题描述】:
我遇到了一个令我困惑的问题。当我尝试将两个表联合在一起时,对第二个表的查询正在生成一个返回到第一个表的内部连接。使用联合的全部意义在于,如果记录存在于任一表中,则返回结果,但如果记录在第二个表中而不是第一个表中,则此内部连接会导致失败。
我在小得多的范围内进行了一些测试,看看我是否发疯了,但事实似乎并非如此。
我有两个表,OrderDetails 和 OrderDetailHistories。背景故事:一定时间后,记录从明细表中删除并放入历史表中。字段和一切都完全相同。事实上,这就是 OrderDetailHistories 的实体:
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]
嗯?为什么第二个选择语句甚至引用详细信息表?当我使用 concat 时会发生什么?一样。相交?相同的内连接。好吧,也许不是先联合,然后应用我的条件,我可以将条件应用到每个查询,然后只联合结果。
这个怎么样?
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();
生成几乎完全相同的查询!有谁知道这里发生了什么?我的期望落空了吗?
如果我在上面的 query1 和 query2 语句的末尾抛出一个 .ToList() ,它的工作方式与我期望的完全一样,但是我失去了在 sql 中进行分页的能力并最终拉下 far 记录太多,而我们每页只显示 10 条。
任何帮助将不胜感激。
【问题讨论】:
标签: c# .net entity-framework linq-to-entities