4

我在数据库中有一堆数据,我想为其编写搜索功能。问题是我得到了很多重复。数据以姓名和姓氏为结构,我只想发送两者中的一个,所以如果我有两个名字为 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);

也许有点混乱,但你明白我想要实现的目标。我可以以某种方式做到这一点,还是有更好的方法来做到这一点?

4

3 回答 3

10

你可以这样做:

var names = db.People
    .Where(r => r.Name.Contains(q))
    .Select(r => new { Name = r.Name, Surname = r.Surname })
    .Distinct()
    .Take(5);

但是,如果这不起作用,因为您需要整个 People 记录,您只需要第一个,我已经成功地完成了这样的事情:

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);
于 2013-02-12T19:47:04.390 回答
4

DistinctEquals在课堂上使用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);
于 2013-02-12T19:49:25.280 回答
2

在类中使用Distinct()和实现方法,或者使用辅助类来比较它们:EqualsPeople

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();
        }
    }
}
于 2013-02-12T19:45:32.450 回答