区别不是为表提供明确的行

时间:2017-02-21 04:16:46

标签: c# asp.net linq

Distinct没有为表格提供明确的行

 ObjectParameter statusCode = new ObjectParameter("StatusCode", typeof(int));
 ObjectParameter statusMessage = new ObjectParameter("StatusMessage", typeof(string));
 return Context.p_Countries_List(userName, statusCode, statusMessage)
              .Select(c => new Countries_List_ResultModel()
            {
                currency = c.currency
            }).Distinct().ToList();

3 个答案:

答案 0 :(得分:1)

您必须覆盖Equals,以便Distinct知道如何告诉另一个实例。

public class Countries_List_ResultModel
{
    public override bool Equals(object obj)
    {
        var item = obj as Countries_List_ResultModel;

        if (item == null)
        {
            return false;
        }

        return true; // Add the appropriate logic.
    }

    public override int GetHashCode()
    {
        // Return the hashcode to quickly identify different instances.
        return this.currency.GetHashCode();
    }
}

更多信息here

答案 1 :(得分:0)

Distinct方法有两个重载:

Distinct<TSource>(this IEnumerable<TSource> source);
Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);

显然,您正在使用第一个使用默认相等比较器来比较值的人。引用类型的默认相等比较器通过引用对它们进行比较,这就是比较器的所有new Countries_List_ResultModel都不同的原因。 您可以创建自己的自定义比较器来检查currency的相等性,并使用以IEqualityComparer<TSource> comparer作为参数的重载。

     return Context.p_Countries_List(userName, statusCode, statusMessage)
              .Select(c => new Countries_List_ResultModel()
            {
                currency = c.currency
            }).Distinct(new MyCustomComparer()).ToList();

    public class MyCustomComparer : IEqualityComparer<Countries_List_ResultModel>
    {
        public bool Equals(Countries_List_ResultModel x, Countries_List_ResultModel y)
        {
            if (x == y) return true;
            if (x == null || y == null) return false;
            return x.currency == y.currency;
        }

        public int GetHashCode(Countries_List_ResultModel obj)
        {
            if (obj == null) return 0;
            return obj.currency.GetHashCode();
        }
    }

答案 2 :(得分:-1)

我找到了答案,这是有效的。

        ObjectParameter statusCode = new ObjectParameter("StatusCode", typeof(int));
        ObjectParameter statusMessage = new ObjectParameter("StatusMessage", typeof(string));
        return Context.p_Currencies_List(userName, statusCode, statusMessage).Distinct().Select(c => new Countries_List_ResultModel()
        {
            currency = c
        }).ToList();