如何从C#中的LINQ查询中获取不同的项?

时间:2014-09-11 13:16:58

标签: c# linq

我有一个查询,它是这样定义的,我用它来生成JSON输出。关键是,我已经应用了Distinct方法,但它仍然显示重复的项目。例如,我有许多项目的值为“Unclassifed”,而我只想要其中一个,其他一些值相同。这是我的疑问:

var results = db.Users.OfType<Business>()
              .Where(b => b.StateID == state && (term == null || b.Description.ToLower().Contains(term.ToLower())))
              .Distinct().Select(x => new { id = x.StateID, value = x.Description }).Take(5).ToList();

任何想法,如何解决?我想我需要以某种方式特别对该值应用Distinct。

5 个答案:

答案 0 :(得分:4)

我怀疑您需要切换DistinctSelect来电。 Distinct将根据您的投影比较您可能期望的更多字段,这可能意味着比较您实际想要比较的字段以外的字段。首先调用Select将减少比较的字段数,以生成不同的列表。

var results = db.Users.OfType<Business>()
          .Where(b => b.StateID == state && (term == null ||  b.Description.ToLower().Contains(term.ToLower())))
          .Select(x => new { id = x.StateID, value = x.Description })
          .Distinct()
          .Take(5)
          .ToList();

答案 1 :(得分:1)

.NET无法知道你想要如何确定&#34;平等&#34;在你的对象中。默认情况下,引用类型的相等性仅基于引用相等性,因此默认情况下所有对象都是不同的。

您可以向Distinct()提供.Name。例如,如果您只是在class BusinessComparer : IEqualityComparer<Business> { public bool Equals(Business x, Business y) { if (Object.ReferenceEquals(x, y)) return true; if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false; return x.Name == y.Name; } public int GetHashCode(Business business) { if (Object.ReferenceEquals(business, null)) return 0; int hashBusinessName = business.Name == null ? 0 : business.Name.GetHashCode(); return hashProductName; } } 属性上进行比较以确定唯一性,则可能如下所示:

Equals

如果此等式是核心业务逻辑而不仅仅用于此特定比较,那么您甚至可以在GetHashCode本身上实现Business和{{1}},以便可以在其他地方使用相等比较。请注意,这可能是对已经假定参照相等的现有代码的重大改变。

答案 2 :(得分:0)

Business类需要覆盖object.Equalsobject.GetHashCode方法,并在IEquatable<T>方法正常运行之前实施Distinct

请参阅MSDN示例:Enumerable.Distinct Method (IEnumerable)

答案 3 :(得分:0)

Distinct()通过使用默认的相等比较器来比较值,从序列中返回不同的元素。所以你应该创建BusinessEqualityComparer类来实现IEqualityComparer接口

class BusinessEqualityComparer : IEqualityComparer<Business>
{

    public bool Equals(Business b1, Business b2)
    {
        if (b1.ID == b2.ID)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    public int GetHashCode(Business business)
    {
        int hCode = business.ID ^ business.ID ^ business.ID;
        return hCode.GetHashCode();
    }

答案 4 :(得分:0)

如果没有提供手动比较器,

.Distinct()将使用已处理类型的默认比较器,该比较器将最终使用.Equals()类的.GetHashCode()Business

因此,除非您已覆盖这些方法.Distinct(),否则只会删除参考文件重复项。