【问题标题】:Unable to cast object of type 'System.Int32' to type 'Product'. in distinct List无法将“System.Int32”类型的对象转换为“Product”类型。在不同的列表中
【发布时间】:2020-04-01 08:42:47
【问题描述】:

我正在使用 Linq to 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 Web 表单页面上的 Gridview、Repeater 等)时,此方法有效。

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

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

但这会产生错误

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

我哪里错了?

【问题讨论】:

  • 您的 select 语句返回类别 ID 的集合,而不是产品的集合。您能解释一下为什么您希望该语句返回产品列表吗?
  • 我以为我得到了具有不同 id 的产品......我认为 MoreLinq 是要走的路......

标签: c# asp.net linq-to-sql


【解决方案1】:

您的逻辑项目distinct CatId 并将其转换为List。这就是为什么您不能将其捕获为List&lt;Product&gt; 的原因(因为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&lt;T&gt; interfacehere 和示例实现here。这种方法为确定唯一性提供了进一步的灵活性。例如,到目前为止,您只有 CatId 字段来查看不同之处。但是,如果您有除 CatId 之外的更多字段,那么此实现将比 Srl a 下提供的选择更好地扩展。

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

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

与任何解决方案一样,看看哪些方法适用于您的情况。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你应该创建这样的类

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

      为了使用这个

      30.GetProduct()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-10
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多