无法将类型 'System.Int32' 的对象转换为类型 'Product'。在不同的列表中

Unable to cast object of type 'System.Int32' to type 'Product'. in distinct List

我正在使用 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();

这在我将数据绑定到我的数据源(我的 ASPX 网页表单页面上的 Gridview、Repeater 等)时有效。

我现在想按类别获取所有不同的产品,所以我创建了以下代码

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

但这会产生错误

"Unable to cast object of type 'System.Int32' to type 'Product'

我哪里错了?

您想要的 Distinct CatId 结果目前默认不支持 Linq。我建议在 MoreLinq

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

你应该像这样创建 class

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

为了使用这个

30.GetProduct()

您的逻辑项目 distinct CatId 并将其转换为 List。这就是为什么您不能将其捕获为 List<Product> 的原因(因为 int 和自定义 Product 之间不存在隐式转换)。

如果您的目标是:

,您在这里几乎没有选择来检索不同的 Products

一个。获取所有不同的 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))

b。如果您愿意,另一种方法是实现 IEqualityComparer<T> interface here and a sample implementation here。这种方法为决定唯一性提供了更多的灵活性。例如,截至目前,您只有 CatId 字段来查看不同的内容。但是,如果您有 CatId 以外的更多字段,那么此实现将比 Srl a.

下提供的选择具有更好的扩展性

c。最后的选择是在 GroupBy 的帮助下提取 distinct。在这里,我们将 ProductsCatId 分组,然后选择列表中的 first

IEnumerable<Product> distinctProducts = c.GroupBy(pro => pro.CatId)
                                                 .Select(f => f.First());

与任何解决方案一样,看看哪种解决方案适合您的情况。