我试图将linq中的两个表(即值,计数等)与sql进行比较,但我无法实现它。我尝试了以下内容,
Table1.Any(i => i.itemNo == Table2.itemNo)
它给出了错误。你能帮我吗?
先谢谢。
答案 0 :(得分:5)
怎么样
var isDifferent =
Table1.Zip(Table2, (j, k) => j.itemNo == k.itemMo).Any(m => !m);
修改强>
如果Linq-To-Sql不支持Zip。
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不能很好地满足你的场景,所以你必须使用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;
这将在服务器上执行select而不向客户端返回大量数据,但是,我认为你会同意更复杂。
<强> EDIT3 强>
好的,zip方法应该适用于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的结果将以任何顺序返回。