在Linq中进行比较
本文关键字:比较 Linq | 更新日期: 2023-09-27 17:58:55
我在数据库中有一堆数据,我想为它们编写一个搜索函数。问题是我得到了很多重复。数据的结构是Names和Surnames,我只想发送两者中唯一的一个,所以如果我有两个姓Foo和姓Bar的人,只有一个会显示。
不管我怎么想,我总是会回过头来,我需要比较它们。
var names = db.People
.Where(r => r.Name.Contains(q))
.OrderBy(r=> r.Name)
*Psuedo-Code*
if((this.Name==next.Name)&&(this.surSame==next.Surname)
toss next data and loop to next
*Psuedo-Code*
.Take(5);
也许有点混乱,但你知道我想要实现什么。我能以某种方式做到这一点吗?或者有更好的方法吗?
您可以这样做:
var names = db.People
.Where(r => r.Name.Contains(q))
.Select(r => new { Name = r.Name, Surname = r.Surname })
.Distinct()
.Take(5);
但如果这不起作用,因为你需要完整的人物记录,你只需要第一个,我已经成功地做了这样的事情:
var names = db.People
.Where(r => r.Name.Contains(q))
.GroupBy(r => new { Name = r.Name, Surname = r.Surname })
.Select(g => g.First())
.Take(5);
Distinct
在People
类上使用Equals
是正确的方法,但这里有一个更"内联"的替代方案:
var names = db.People
.Where(r => r.Name.Contains(q))
.GroupBy(r => new { r.Name, r.Surname })
.Select(g => g.First())
.OrderBy(r => r.Name)
.Take(5);
使用Distinct()
并在People
类中实现方法Equals
,或者使用辅助类来比较它们:
public class PeopleComparer : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
return x.Name == y.Name && x.Surname == y.Surname;
}
public int GetHashCode(People obj)
{
unchecked
{
return (obj.Name.GetHashCode() * 31) + obj.Surname.GetHashCode();
}
}
}