在Linq比较

时间:2013-02-12 19:41:54

标签: c# linq

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

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

3 个答案:

答案 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)

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

答案 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();
        }
    }
}