无法将类型 '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。在这里,我们将 Products
按 CatId
分组,然后选择列表中的 first
。
IEnumerable<Product> distinctProducts = c.GroupBy(pro => pro.CatId)
.Select(f => f.First());
与任何解决方案一样,看看哪种解决方案适合您的情况。
我正在使用 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
中使用 DistinctByvar 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。在这里,我们将 Products
按 CatId
分组,然后选择列表中的 first
。
IEnumerable<Product> distinctProducts = c.GroupBy(pro => pro.CatId)
.Select(f => f.First());
与任何解决方案一样,看看哪种解决方案适合您的情况。