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

Jav*_*med 2 linq linq-to-sql

我试图比较linq中的两个表(即值,计数等)到sql,但我没有得到实现它的方法.我试过以下,

Table1.Any(i => i.itemNo == Table2.itemNo)
Run Code Online (Sandbox Code Playgroud)

它给出了错误.请你帮助我好吗?

提前致谢.

Jod*_*ell 5

怎么样

var isDifferent =
        Table1.Zip(Table2, (j, k) => j.itemNo == k.itemMo).Any(m => !m);
Run Code Online (Sandbox Code Playgroud)

编辑

如果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);
Run Code Online (Sandbox Code Playgroud)

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

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; 
Run Code Online (Sandbox Code Playgroud)

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


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);
Run Code Online (Sandbox Code Playgroud)

你可能应该考虑在列表检索器上下一个订单,就像这样.

var one = Table1.OrderBy(o => o.itemNo).ToList();
Run Code Online (Sandbox Code Playgroud)

严格地说,除非指定了订单,否则Linq-to-Sql的结果将以任何顺序返回.