我在数据库中有一堆数据,我想为其编写搜索功能。问题是我得到了很多重复。 数据以名称和姓氏结构,我想只发送一个唯一的两个,所以如果我有两个名字为Foo,姓氏只有一个会显示。
无论我如何看待它,我总是回到我需要比较它们。
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);
也许有点乱,但你明白了我想要实现的目标。我可以用某种方式做到这一点,还是有更好的方法去做?
答案 0 :(得分:10)
你可以这样做:
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);
答案 1 :(得分:4)
Distinct
在Equals
课程中使用People
将是正确的方法,但这里有一个更“内联”的替代方案:
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);
答案 2 :(得分:2)
使用Distinct()
并在Equals
类中实现方法People
,或使用辅助类来比较它们:
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();
}
}
}