Ваша логика c проецирует distinct CatId
и преобразует ее в List
. Вот почему вы не можете захватить его как List<Product>
(поскольку не существует неявного преобразования между int
и пользовательским Product
).
У вас есть несколько вариантов, чтобы получить различные Products
, если это то, к чему вы стремитесь:
a. Получите все отличные CatId
и переберите коллекцию Product
, чтобы создать подмножество.
//get all distinct CatIds
var catIds = c.Select(cat => cat.CatId).Distinct().ToList();
//retrieve products that belongs to catids
var products = c.Where(p => catIds.Contains(p.CatId))
б. Если вы предпочитаете, дальнейшим подходом будет реализация IEqualityComparer<T> interface
здесь и пример реализации здесь . Этот подход обеспечивает дополнительную гибкость для определения уникальности. Например, на данный момент у вас есть только поле CatId
, чтобы увидеть, что отличается. Но если у вас есть больше полей, кроме CatId
, то эта реализация будет масштабироваться лучше, чем выбор, предоставленный в Srl a.
c. Окончательный вариант - извлечь отдельное с помощью GroupBy
. Здесь мы группируем Products
по CatId
и затем выбираем first
в списке.
IEnumerable<Product> distinctProducts = c.GroupBy(pro => pro.CatId)
.Select(f => f.First());
Как и в любом решении, посмотрите, что работает и подходит для вашего случая.