2014-12-04 48 views
1

我遇到了困擾我的問題。當我嘗試將兩個表聯合在一起時,對第二個表的查詢將生成一個返回到第一個表的內部聯接。使用聯合的要點是,如果記錄存在於任一表中,則返回結果,但如果記錄位於第二個表中,但此內部聯接導致它失敗,但不是第一個。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頁。

任何幫助,將不勝感激。

回答

1

我不知道你使用的EF方法,我想先編碼。但無論如何,你使用錯了,或者你不知道它是如何工作的。當你從OrderDetail繼承你的OrderDetailsHistory類,那麼它說,OrderDetailsHistory總是OrderDetail

所以,如果你想選擇所有訂單你可以查詢OrderDetail會有也是所有OrderDetailsHistory實體:

this.context.OrderDetails 
    .Select(x => x.Descr) 
    .Where(x => x == "wat") 
    .ToList(); 

同樣重要的是要知道數據是如何存儲在數據庫中。您正在使用每個類的形式給出表 - 讀到它(例如http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt)一些文章來了解它是如何工作的,那麼你也就會明白爲什麼所有的疑問看起來「太奇怪了」 ...