我想比較兩個表(即值,計數等..)在LINQ到SQL,但我沒有得到實現它的方式。我試過以下,如何比較linq到sql中的兩個表?
Table1.Any(i => i.itemNo == Table2.itemNo)
它給出錯誤。你可以幫我嗎?
在此先感謝。
我想比較兩個表(即值,計數等..)在LINQ到SQL,但我沒有得到實現它的方式。我試過以下,如何比較linq到sql中的兩個表?
Table1.Any(i => i.itemNo == Table2.itemNo)
它給出錯誤。你可以幫我嗎?
在此先感謝。
怎麼樣
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的結果以任意順序返回,除非指定了順序。
如何在if語句中使用它 – 2012-07-10 08:35:16
您的代碼是好的,但我不能在我的if語句中根據結果返回true或false。 – 2012-07-10 08:38:30
上述語句的返回類型是一個布爾值,所以只需在它和一些括號前加上'if',然後在if語句中就可以得到它...... – Chris 2012-07-10 08:39:12
我想在一個布爾函數中實現它。基於比較,如果值或計數匹配,我想返回true或false。 – 2012-07-10 08:24:24
你究竟在比較什麼?表格中的數據是否必須相同? – Vedran 2012-07-10 08:25:32
是的,表中的數據必須相同,甚至行數應該匹配。 – 2012-07-10 08:27:36