簡體   English   中英

LINQ Distinct()甚至無法實現Equals()和GetHashCode()

[英]LINQ Distinct() not work even implemented Equals() & GetHashCode()

在問這個簡單的問題之前我做了一些研究,但仍然無法使它工作......

下面是我的對象類和我的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 ...

可能的原因是什么?如何解決?

您已在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();
    }
}

然后你的不同呼吁是:

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

實現IEquatable<T>接口。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM