在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);

也许有点混乱,但你知道我想要实现什么。我能以某种方式做到这一点吗?或者有更好的方法吗?

在Linq中进行比较

您可以这样做:

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);

DistinctPeople类上使用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();
        }
    }
}