How to use LINQ Distinct() with multiple fields

c#, distinct, linq

Solution

I assume that you use distinct like a method call on a list. You need to use the result of the query as datasource for your DropDownList, for example by materializing it via `ToList`.

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

Another way if you need the real objects instead of the anonymous type with only few properties is to use `GroupBy` with an anonymous type:

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

A third option is to use MoreLinq's `DistinctBy`.

Problem

I have the following EF class derived from a database (simplified) ``` class Product { public string ProductId; public string ProductName; public string CategoryId; public string CategoryName; } ``` `ProductId` is the Primary Key of the table. For a bad design decision made by the DB designer (I cannot modify it), I have `CategoryId` and `CategoryName` in this table. I need a DropDownList with (distinct) `CategoryId` as Value and `CategoryName` as Text. Therefore I applied the following code: ``` product.Select(m => new {m.CategoryId, m.CategoryName}).Distinct(); ``` which logically it should create an anonymous object with `CategoryId` and `CategoryName` as properties. The `Distinct()` guarantees that there are no duplicates pair (`CategoryId`, `CategoryName`). But actually it does not work. As far as I understood the `Distinct()` works just when there is just one field in the collection otherwise it just ignores them...is it correct? Is there any workaround? Thanks! UPDATE Sorry `product` is: ``` List<Product> product = new List<Product>(); ``` I found an alternative way to get the same result as `Distinct()`: ``` product.GroupBy(d => new {d.CategoryId, d.CategoryName}) .Select(m => new {m.Key.CategoryId, m.Key.CategoryName}) ```

Original source

Related problems