-3

在不同的服务器上有 2 个具有相同名称的相同表。假设Table1Table2。我需要比较表格,如果有任何字段值不匹配,则必须报告。我正在使用C# 和实体框架。我能够检索表(记录集)的行,但我如何检查数据行的每个字段。两个表中的列数和列名相同且顺序相同。有这么几张桌子。我需要从每个表中获取字段值并与另一个表中的相同字段进行比较。如何使用 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();

之后,创建一个方法来比较两个对象的公共属性的值。

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 回答