【问题标题】:field value from a table using linq c#使用linq c#从表中获取字段值
【发布时间】:2016-01-14 13:53:38
【问题描述】:

在不同的服务器上有 2 个同名的相同表。假设 Table1Table2。我需要比较表格,如果有任何字段值不匹配,则必须报告。我正在使用 C# 和实体框架。 我能够检索表(记录集)的行,但我如何检查数据行的每个字段。两个表中的列数和列名相同且顺序相同。有这么几张桌子。 我需要从每个表中获取字段值并与另一个表中的相同字段进行比较。如何使用 EF 和 Linq 检索字段值。 如果它使用 EF 很复杂,是否有任何其他方法来访问表和比较字段值。

要执行的任务: 比较 Table1.Row[1]Column[2].value Table2.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");

                    }
                }

【问题讨论】:

  • 您应该自己尝试一下,如果遇到问题,请发布有错误的代码,我们可以帮助您。
  • 感谢@BenClarke 的建议 query1 和 query2 包含数据行。但是当检查对象 query1/query2 时,您会看到匿名类型的数据。如何从 query1/query2 中检索数据。

标签: c# entity-framework linq data-comparison


【解决方案1】:

鉴于每个对象都具有相同的属性,您需要做的是遍历两个对象的所有属性并比较值。

所以,创建一个属性映射:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多