2016-01-26 2 views
2

Я сделал некоторые исследования, прежде чем задать этот простой вопрос, но до сих пор не могу заставить его работать ...LINQ Distinct() не работают даже реализованы 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(); 

Но результирующий набор явно дублируют несколько ItemGridViewModel с таким же ItemID ...

Каковы возможные причины & как я могу ее решить?

ответ

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

и тогда ваш вызов отчетливого будет:

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

Спасибо, я тупой, надеюсь кто-то может исправить это тоже – shole

+2

@shole - не стоит беспокоиться. Это распространенная ошибка. Это не значит, что вам не нужно, только вам нужно больше практики. –

+0

Или просто регулярное 'переопределение'' Object.Equals'/'Object.GetHashCode' будет –

1

Внештатный IEquatable<T> Интерфейс.

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

Спасибо, Джастин является на несколько секунд быстрее, поэтому я принял его ответ. :) – shole

+0

@shole, на самом деле я был первым, кто ответил;) Проверьте время ответа: D –

+0

Вы правы ... просто .. теперь просто обвиняйте меня: "( – shole

Смежные вопросы