Невозможно привести объект типа «System.Int32» к типу «Product». в отдельном списке - PullRequest
0 голосов
/ 01 апреля 2020

Я использую Linq для Sql.

Вот данные в моей базе данных

Cat 20 is Stationery
Cat 30 is Computer Items
Cat 40 is Toiletry

**Id CatId ProductName**
1   20     Pencil
1   20     Pen
1   30     Compact Disc
1   30     USB
1   30     Hard drive
1   40     Toothpaste
1   40     Toothbrush

Я получаю все свои продукты, как показано ниже

List<Product> c = myContext.GetProducts(activeStatus).ToList();

Это работает, когда я связываю данные с моим источником данных (Gridview, Repeater et c на моей странице веб-форм ASPX).

Теперь я хочу получить все отдельные продукты по категориям, поэтому я создаю следующий код

List<Product> cats = c.Select(cat => cat.CatId).Distinct().ToList();

Но это выдает ошибку

"Невозможно привести объект типа 'System.Int32' к типу 'Product'

Где я идет не так?

Ответы [ 3 ]

0 голосов
/ 01 апреля 2020

Вы должны создать класс, подобный этому

public static class ConverterLocal
    {
        public static ReturnType GetProduct(this int id)
        {
            //Here your statement
            return ReturnType;
        }
    }

Для использования этого

30.GetProduct()
0 голосов
/ 01 апреля 2020

Ваша логика 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());

Как и в любом решении, посмотрите, что работает и подходит для вашего случая.

0 голосов
/ 01 апреля 2020

Ваш желаемый результат от Distinct CatId, который в настоящее время не поддерживается по умолчанию Linq. Я предлагаю использовать DistinctBy в MoreLinq

var query = c.DistinctBy(p => p.CatId).ToList();
...