我有一个查询,它是这样定义的,我用它来生成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。
答案 0 :(得分:4)
我怀疑您需要切换Distinct
和Select
来电。 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.Equals
和object.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()
,否则只会删除参考文件重复项。