-3

異なるサーバーに同じ名前の 2 つの同一のテーブルがあります。Table1Table2としましょう。テーブルを比較し、一致しないフィールド値がある場合は報告する必要があります。私はC# と Entity Frameworkを使用しています。テーブル(レコードセット)の行を取得できましたが、データ行のすべてのフィールドを確認するにはどうすればよいですか。両方のテーブルの列の数と名前は同じで、同じ順序になっています。このようなテーブルがいくつかあります。各テーブルからフィールド値を取得し、別のテーブルの同じフィールドと比較する必要があります。EF と Linq を使用してフィールド値を取得するにはどうすればよいですか? EFを使用して複雑な場合、テーブルにアクセスしてフィールド値を比較する他の方法はありますか?

実行するタスク: Table1.Row [1]Column[2] .valueTable2.Row[1]Column[2] .value を比較します。

var query1 = (from prod in con1.Products
                          select new { }).ToList();    
var query2 = (from prod in con2.Products
                              select new { }).ToList();

                for (int i = 0; i < query1.Count; i++)
                {
                    Console.WriteLine(query1.GetType());
                    if (query1[i] != query2[i])
                    {
                        Console.WriteLine("Data not matching at");

                    }
                }
4

1 に答える 1

0

各オブジェクトが同じプロパティを持っている場合、必要なことは、両方のオブジェクトのすべてのプロパティを繰り返し処理し、値を比較することです。

したがって、プロパティのマップを作成します。

var sourceProperties = typeof(DbModel1.Product).GetProperties();
var destinationProperties = typeof(DbModel2.Product).GetProperties();
var commonProperties = sourceProperties
    .Join(destinationProperties,
        propInfo => propInfo.Name,
        propInfo => propInfo.Name,
        (source, dest) => new KeyValuePair<PropertyInfo, PropertyInfo>(source, destination))
    .ToArray();

その後、2 つのオブジェクトの共通プロパティの値を比較するメソッドを作成します。

public bool AreEqual(IEnumerable<KeyValuePair<PropertyInfo, PropertyInfo>> properties,
    DbModel1.Product left,
    DbModel2.Product right)
{
    foreach(var property in properties)
    {
        var leftValue = property.SourceProperty.GetValue(left, null);
        var rightValue = property.DestinationProperty.GetValue(right, null);
        if(!leftValue.Equals(rightValue))
            return false;
    }
    return true;
}

次に、一致しない項目を選択しますZip query1query2

var differentItems = query1.Zip(query2,
        (first, second) => new { First = first, Second = second})
    .Where(x => !AreEqual(commonProperties, x.First, x.Second));
于 2016-01-14T15:20:16.000 に答える