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}) ```