在问这个简单的问题之前,我做了一些研究,但仍然无法使其发挥作用......
下面是我的对象类和我的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
...
可能的原因是什么?我怎么解决呢?
答案 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>
{
...
}