C# 无法将“System.Int32”类型的对象强制转换为“Product”类型。在不同的列表中

C# 无法将“System.Int32”类型的对象强制转换为“Product”类型。在不同的列表中,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我正在使用LINQtoSQL 这是我数据库中的数据 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 Toothb

我正在使用LINQtoSQL

这是我数据库中的数据

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 web表单页面上的数据源Gridview、Repeater等时,这就起作用了

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

List<Product> cats = c.Select(cat => cat.CatId).Distinct().ToList();
但这会产生错误

无法将类型为“System.Int32”的对象强制转换为类型为“Product”


哪里出了问题?

您希望从Distinct CatId获得的结果,默认情况下Linq不支持该结果。我建议使用DistinctBy


您应该创建这样的类

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

30.GetProduct()
您的逻辑投影不同的CatId并将其转换为列表。这就是为什么不能将其捕获为列表,因为int和定制产品之间不存在隐式转换

如果您的目标是:

a。获取所有不同的CatId并迭代产品集合以创建子集

//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接口和示例实现。这种方法为确定唯一性提供了进一步的灵活性。例如,到目前为止,只有CatId字段可以查看不同的内容。但是,如果您有除CatId之外的更多字段,那么此实现将比Srl a下提供的选项扩展得更好

c。最后一个选项是在GroupBy的帮助下提取distinct。在这里,我们根据CatId对产品进行分组,然后选择列表中的第一个

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

与任何解决方案一样,请查看在您的情况下什么是有效的和合适的。

select语句返回类别id的集合,而不是产品的集合。你能解释一下为什么你希望这个语句返回一个产品列表吗?我以为我得到的是具有不同ID的产品。。。。我想MoreLinq是一条路。。。。。
IEnumerable<Product> distinctProducts = c.GroupBy(pro => pro.CatId)
                                                 .Select(f => f.First());