linq - 如何比较 linq 和 sql 中的两个表?

标签 linq linq-to-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-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);

如果表变化很大,这可能会导致性能问题。在这种情况下,您将需要一个更复杂的解决方案,如果是这样,请询问。

编辑2

如果表非常大,您不想从服务器获取所有数据并将其保存在内存中。此外,除非您在查询中指定顺序,否则 Linq 和 SQL Server 不会保证行的顺序。这对于多处理器服务器返回的大型结果集尤其相关,其中并行性的影响可能会发挥作用。

我建议 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; 

这将在服务器上进行选择,而不会向客户端返回大量数据,但是,我认为您会同意要复杂得多。

编辑3

好的,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 的结果会以任何顺序返回。

关于linq - 如何比较 linq 和 sql 中的两个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11409319/

相关文章:

c# - Regex Replace 以协助 LINQ 中的 Orderby

c# - Linq order by aggregate in select { }

c# - 如何正确使用 LINQ 和 MySQL?

c# - Linq-to-SQL 中十进制的一元减法

c# - Find() 和 First() 抛出异常,如何返回 null?

c# - linq to sql查询使用方法

c# - LINQ 查询无法识别重复项

c# - 在 C# 中使用 Linq 匹配 2 个集合之间的元素

c# - LINQ to SQL 查找未在另一个列表中列出的对象

c# - 如何使用 Linq to SQL 将对象序列化并保存到数据库中作为 Xml