4

検索関数を作成したいデータベースに大量のデータがあります。問題は、多くの重複を取得していることです。データは Names と Surnames で構成されており、両方の一意の 1 つだけを送信したいので、名前が Foo で姓が Bar の 2 人がいる場合、1 つだけが表示されます。

どんなに考えても、比較する必要があるということにはいつも戻ってきます。

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

Distinctクラスで利用するEqualsPeopleが正しい方法ですが、より「インライン」な代替方法を次に示します。

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 に答える