我遇到了困擾我的問題。當我嘗試將兩個表聯合在一起時,對第二個表的查詢將生成一個返回到第一個表的內部聯接。使用聯合的要點是,如果記錄存在於任一表中,則返回結果,但如果記錄位於第二個表中,但此內部聯接導致它失敗,但不是第一個。Linq to Entities Union生成工會表的內部聯接
我在一個更小的規模上做了一些測試,看看我是否瘋了,而且似乎並非如此。
我有兩個表,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]
咦?爲什麼第二個select語句甚至引用了細節表?當我使用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();
生成幾乎完全相同的查詢!有人知道這裏發生了什麼嗎?我的期望剛剛結束了嗎?
如果我把一個.ToList()在QUERY1和QUERY2語句結束上面它的工作原理完全一樣,我期望,但後來我失去了我做傳呼的SQL,並最終拉低遠能力太多的記錄,當我們只顯示10頁。
任何幫助,將不勝感激。