2012-03-19 6 views
1

Iはリストとしてwhere句に基づいて、テーブルに格納されたデータのすべてを返すLINQクエリを持っている:特定の行に.Distinct()を使用

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id).ToList(); 

これは23の項目を返すが、いくつかのこれらのアイテムには重複したデータを含むいくつかの列があり、ColumnA、ColumnBおよびColumnDと呼びます。私は試しました:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id) 
       .Distinct().ToList(); 

しかし、これはちょうど同じ23行を返します。

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id) 
       .Distinct(x=> new { x.ColumnA, x.ColumnB, x.ColumnD }).ToList(); 

これが可能であるか、私はこれを行うための新しい方法を探す必要があります:私は、のようなものを私は個別の値を持つようにしたい列を指定することができれば、私がしたい何がありますか?

答えて

7

GroupByFirstを組み合わせてみてください。

List<Catalogue> data = context.Catalogue 
    .Where(x => x.ManID == id) 
    .GroupBy(x => new { x.ColumnA, x.ColumnB, x.ColumnD }) 
    .Select(g => g.First()) 
    .ToList(); 
+0

これにジャスト調整は:私は最初としてFirstOrDefaultを()()を使用していたエラーを投げたが、これは完全に感謝働きました!私は私ができる時に答えとして受け入れるよ! – CallumVass

2

それは文脈に依存します。これは、LINQ to SQLのようなものの範囲内であれば、私はGroupByを使用したい:

List<Catalogue> data = context.Catalogue 
           .Where(x=>x.ManID == id) 
           .GroupBy(x=> new { x.ColumnA, 
               x.ColumnB, 
               x.ColumnD }) 
           .Select(g => g.First()) 
           .ToList(); 

(EDIT:First本当にを使用してここに罰金でなければならないことに注意してください - あなたは、各グループとして、FirstOrDefault()を使用する必要はありませんが。でも、存在するために、少なくとも1つのエントリが必要)

をLINQのオブジェクトに、私はMoreLINQとそのDistinctByメソッドを使用したい:

List<Catalogue> data = context.Catalogue 
           .Where(x=>x.ManID == id) 
           .DistinctBy(x=> new { x.ColumnA, 
                x.ColumnB, 
                x.ColumnD }) 
           .ToList(); 
0

Distinct()で使用できる3つのプロパティに対してIEqualityComparerを作成します。

IEqualityComparer

関連する問題