LINQ Distinct()甚至无法实现Equals()& GetHashCode的()

时间:2016-01-26 03:20:57

标签: c# linq

在问这个简单的问题之前,我做了一些研究,但仍然无法使其发挥作用......

下面是我的对象类和我的LINQ查询

  public class ItemGridViewModel: IEqualityComparer<ItemGridViewModel>
  {
        public ItemGridViewModel() { }

        public int ItemID { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public decimal Qty { get; set; }

        public bool Equals(ItemGridViewModel x, ItemGridViewModel y) 
        {
             return x.ItemID == y.ItemID; 
        }
        public int GetHashCode(ItemGridViewModel obj) { return obj.ItemID; }
  }

var query = (from ccp in CostCenterParaQuery
     where ccp.CostCentreID != null && costCenterList2.Contains(ccp.CostCentreID.Value)
     select ccp into g
     from s in StoreRoomQuery
     where s.CostCentreCode == g.CostCentreCode
     select s into g2
     from b in BinItemStatQuery
     where b.Qty > 0 && b.IsFrozen == "N" && b.StoreroomID == g2.StoreroomID
     select b into g3
     from i in ItemsQuery
     where ((i.ItemID == g3.ItemID) && 
         (whereClause.Code == null || i.ItemCode == whereClause.Code) &&   
         (whereClause.Description == null || i.Description == whereClause.Description))
     select new ItemGridViewModel()
     {
         Qty = g3.Qty,
         Code = i.ItemCode,
         Description = i.Description,
         ItemID = i.ItemID
     }).Distinct();

但结果集明显重复了几个具有相同ItemID的ItemGridViewModel ...

可能的原因是什么?我怎么解决呢?

2 个答案:

答案 0 :(得分:7)

您已在ItemGridViewModel中实施了错误的界面。根据用法,我认为您需要IEquatable<T>

IEqualityComparer<T>用于构建一个单独的对象,其责任仅仅是比较T类型的对象:

public class ItemGridViewModel
{
    // Your implementation
}

public class ItemGridViewModelEqualityComparer : IEqualityComparer<ItemGridViewModel> 
{
    public bool Equals(ItemGridViewModel a, ItemGridViewModel b)
    {
        return a.ItemID == b.ItemID;
    }

    public int GetHashCode(ItemGridViewModel o)
    {
        return o.ItemID.GetHashCode();
    }
}

然后您对distinct的调用将是:

// rest of query
select new ItemGridViewModel()
{
    // assignment
}).Distinct(new ItemGridViewModelEqualityComparer());

答案 1 :(得分:1)

实施IEquatable<T>界面。

public class ItemGridViewModel: IEquatable<ItemGridViewModel>
{
    ...
}