2012-07-10 49 views
2

我想比較兩個表(即值,計數等..)在LINQ到SQL,但我沒有得到實現它的方式。我試過以下,如何比較linq到sql中的兩個表?

Table1.Any(i => i.itemNo == Table2.itemNo) 

它給出錯誤。你可以幫我嗎?

在此先感謝。

+0

我想在一個布爾函數中實現它。基於比較,如果值或計數匹配,我想返回true或false。 – 2012-07-10 08:24:24

+0

你究竟在比較什麼?表格中的數據是否必須相同? – Vedran 2012-07-10 08:25:32

+0

是的,表中的數據必須相同,甚至行數應該匹配。 – 2012-07-10 08:27:36

回答

5

怎麼樣

var isDifferent = 
     Table1.Zip(Table2, (j, k) => j.itemNo == k.itemMo).Any(m => !m); 

編輯

如果LINQ到SQL不支持郵編。

var one = Table1.ToList(); 
var two = Table2.ToList(); 

var isDifferent = 
     one.Zip(two, (j, k) => j.itemNo == k.itemMo).Any(m => !m); 

如果表格變化很大,則可能會導致性能問題。在這種情況下,您需要更復雜的解決方案,如果是這樣,請詢問。

EDIT2

如果表是非常大的,你不想從服務器獲取的所有數據,並保持記憶。另外,除非您在查詢中指定了訂單,否則Linq和SQL服務器不會放棄行的順序。對於可能發揮並行效果的多處理器服務器返回的大型結果集,這變得尤爲重要。

我建議Linq-to-Sql doesen沒有真正適合你的情況,所以你將不得不使用ExecuteQuery這樣的東西來幫忙。

string zipQuery = 
@"SELECT TOP 1 
     1 
    FROM 
     [Table1] [one] 
    WHERE 
     NOT EXISTS (
      SELECT * FROM [Table2] [two] WHERE [two].[itemNo] = [one].[itemNo] 
     ) 
UNION ALL 
SELECT 
     1 
    FROM 
     [Table2] [two] 
    WHERE 
     NOT EXISTS (
      SELECT * FROM [Table1] [one] WHERE [one].[itemNo] = [two].[itemNo] 
     ) 
UNION ALL 
SELECT 0"; 

var isDifferent = context.ExecuteQuery<int>(zipQuery).Single() == 1; 

這將做服務器上的選擇,而無需返回大量數據到客戶端,但是,我想你會複雜得多同意。


EDIT3

好吧,拉鍊方法應爲1000行被罰款。我已閱讀您的評論,並建議相應地更改代碼。

var one = Table1.ToList(); 
var two = Table2.ToList(); 

var isDifferent = 
    one.Count != two.Count || 
    one.Zip(two, (o, t) => o.itemNo == k.itemNo).Any(m => !m); 

您應該考慮在列表檢索器上放置一個命令,就像這樣。

var one = Table1.OrderBy(o => o.itemNo).ToList(); 

嚴格說來,Linq-to-Sql的結果以任意順序返回,除非指定了順序。

+0

如何在if語句中使用它 – 2012-07-10 08:35:16

+0

您的代碼是好的,但我不能在我的if語句中根據結果返回true或false。 – 2012-07-10 08:38:30

+0

上述語句的返回類型是一個布爾值,所以只需在它和一些括號前加上'if',然後在if語句中就可以得到它...... – Chris 2012-07-10 08:39:12