1. ホーム
  2. c#

[解決済み] LINQ Distinct() を複数フィールドで使用する方法

2023-05-22 15:06:54

質問

私は以下のような EFクラス データベースから派生したクラス(簡略化)

class Product
{ 
     public string ProductId;
     public string ProductName;
     public string CategoryId;
     public string CategoryName;
}

ProductId 主キー であり、テーブルの

DB設計者が行った間違った設計判断のため(私は修正できません)、私は CategoryIdCategoryName をこのテーブルの中に入れてください。

を必要とします。 DropDownList で、(明確な) CategoryId として そして CategoryName として テキスト . そこで、以下のようなコードを適用してみました。

product.Select(m => new {m.CategoryId, m.CategoryName}).Distinct();

で無名オブジェクトを作成する必要がありますが、論理的には CategoryIdCategoryName をプロパティとして指定します。また Distinct() は、重複するペアがないことを保証します ( CategoryId , CategoryName ).

しかし、実際にはうまくいきません。私が理解した限りでは Distinct() が動作するのは、コレクションにフィールドが1つだけある場合だけで、それ以外は無視されるだけだと理解しています。何か回避策はありますか?ありがとうございます。

アップデイト

申し訳ございません。 product

List<Product> product = new List<Product>();

と同じ結果を得るための別の方法を見つけました。 Distinct() :

product.GroupBy(d => new {d.CategoryId, d.CategoryName}) 
       .Select(m => new {m.Key.CategoryId, m.Key.CategoryName})

どのように解決するのですか?

私はあなたがリスト上のメソッド呼び出しのように明確なを使用していると仮定します。クエリの結果を DropDownList のデータソースとして使用する必要があります。 ToList .

var distinctCategories = product
                        .Select(m => new {m.CategoryId, m.CategoryName})
                        .Distinct()
                        .ToList();
DropDownList1.DataSource     = distinctCategories;
DropDownList1.DataTextField  = "CategoryName";
DropDownList1.DataValueField = "CategoryId";

いくつかのプロパティしか持たない匿名型ではなく、実際のオブジェクトが必要な場合の別の方法として GroupBy を無名型と一緒に使うことです。

List<Product> distinctProductList = product
    .GroupBy(m => new {m.CategoryId, m.CategoryName})
    .Select(group => group.First())  // instead of First you can also apply your logic here what you want to take, for example an OrderBy
    .ToList();

第三の方法として MoreLinq の DistinctBy .