2013-05-06 60 views
1

我有兩個相同的表。一個是實時數據,另一個是分級數據。LINQ查找在兩個單獨的表中不同的記錄

它們在兩列上都有相同的唯一鍵約束。

使用Linq,是否有可能獲得ProductionStaging不同的記錄列表?

表看起來是這樣的:

string name 
string number 
timespan timeIn 
timespan timeOut 
. 
snip 
. 
string lastDay 

就像我說的,這兩個表是相同的,我想只有在列[後] namenumber從相同的記錄不同的Production表假設記錄namenumber構成主鍵。

編輯

難道僅僅用&&!='s長查詢?

+0

覆蓋您的記錄類型的** Equals()**方法。 – 2013-05-06 03:47:19

+0

Pieter,你的意思是linq Equals方法還是我可能寫的? – griegs 2013-05-06 03:53:35

+2

我的意思是:覆蓋** object **提供的** Equals()**方法作爲您的記錄類型的_value equality_的(默認)定義,以便爲您的記錄類型正確定義_value equality_。只有你知道如何正確地爲你的記錄類型定義_value equality_;預包裝的任何東西都必須在屬性的_reference equality_和_value equality_之間進行猜測。 – 2013-05-06 03:56:10

回答

1

使用LINQ joinwhere條款相結合 - 是這樣的:

from s in Staging 
join p in Production on new {s.name, s.number} equals new {p.name, p.number} 
where s.timeIn != p.timeIn || s.timeOut != p.timeOut || s.lastDay != p.lastDay 
select s 

我只包括列你name當然number後表現 - 而不是那些你剪斷,但你的想法。

C# Programming Guide有關於使用組合鍵加入的更多信息。

+1

是的,我有點懷疑這樣的事情,但希望有可能有更好的辦法 – griegs 2013-05-06 03:54:03

+0

羅傑說。我會對更好的方式感興趣 - 總是。 :) – J0e3gan 2013-05-06 03:55:30

0

他們是一個除外條款,將給你所有的生產記錄,除了那些是相同的,因此有什麼不同的生產。請注意,這意味着在分段中可能有不同的記錄,但您不會看到它們。 J0e3gan的查詢恰恰相反,只顯示與生產不同的暫存記錄。

如果你想看到所有的差異,你真的需要運行查詢兩次,每次顛倒,然後將它們聯合起來。這與您在SQL中使用EXCEPT語句的技巧相同。

db.production.Except(db.staging); 

還是更喜歡

db.production.Except(db.staging).Union(db.staging.Except(db.production)); 

注意,如果分期和生產的實體類型是相同的,這將可能只工作。您可能需要這樣做

db.production.Except(db.staging.Select(s=> new ProductionEntity{ id = s.id, name = s.name, lastDay = s.lastDay ,etc. }); 
相關問題