4

linqの2つのテーブル(つまり、値、カウントなど)をsqlと比較しようとしていますが、それを実現する方法がありません。私は次のことを試みました、

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

エラーが発生します。手伝っていただけませんか?

前もって感謝します。

4

1 に答える 1

6

どうですか

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; 

これにより、クライアントに大量のデータを返すことなくサーバー上で選択が実行されますが、はるかに複雑であることに同意すると思います。


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の結果は、順序が指定されていない限り、任意の順序で返されます。

于 2012-07-10T08:28:15.173 に答える