比较两个Linq对象

时间:2011-07-15 10:56:02

标签: c# .net linq

我想比较两个相同的Linq表对象,迭代它们的属性但是我必须省略一些属性,这些属性是具有一个参数的泛型类型,例如EntitySet(LinqTable有很多不同的类型),我如何检查属性是否属于该类型(EntitySet)?

很抱歉没有代码,但我是用手机写的:)如果有必要,我会附加一些代码;)

编辑:

我终于通过以下代码解决了这个问题:

internal static void AssertIsEqualTo<T>(this T value, T comparedValue, List<string> fieldsToAvoid)
{
    Type type = typeof(T);
    PropertyInfo[] properties = type.GetProperties();

    if (fieldsToAvoid == null)
    {
        fieldsToAvoid = new List<string>();
    }

    for (int i = 0; i < properties.Length; i++)
    {
        var expectedPropertyValue = properties[i].GetValue(value, null);
        var actualPropertyValue = properties[i].GetValue(comparedValue, null);

        if (!fieldsToAvoid.Contains(properties[i].Name))
        {
            if (properties[i].PropertyType.Name != typeof(System.Data.Linq.EntitySet<object>).Name)
            {
                Assert.AreEqual(expectedPropertyValue, actualPropertyValue, "In {0} object {1} is not equal.", type.ToString(), properties[i].Name);
            }
        }
    }
}

在Name中,Type对象的属性类似于“EntitySet'1”,这意味着具有一个参数的EntitySet对象。

也许有人知道更好的解决方法吗?

1 个答案:

答案 0 :(得分:2)

创建一个实现IEqualityComparer的类,例如

public class ProjectComparer : IEqualityComparer<Project>
{
    public bool Equals(Project x, Project y)
    {
        if (x == null || y == null)
            return false;
        else
            return (x.ProjectID == y.ProjectID);
    }

    public int GetHashCode(Project obj)
    {
        return obj.ProjectID.GetHashCode();
    }
}

将Equals方法中的逻辑替换为您需要的任何内容,然后使用各种方式比较您的对象,例如:最简单的:

bool areEqual = new ProjectComparer().Equals(project1, project2);