【问题标题】:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.List<CUSTOM DATA TYPE> [duplicate]无法将类型“System.Collections.Generic.IEnumerable<AnonymousType#1>”隐式转换为“System.Collections.Generic.List<CUSTOM DATA TYPE> [重复]
【发布时间】:2012-12-03 16:33:18
【问题描述】:

我调用了一个GetData 调用,它返回了一个IQueryable 对象。我使用以下 LINQ SelectMany 过滤并选择了我需要的字段 返回一个List&lt;MyDataType&gt;,我得到以下错误

无法将类型 System.Collections.Generic.List&lt;AnonymousType#1&gt; 隐式转换为 System.Collection.Generic.List&lt;MyDataType&gt;

这是我的代码

List<CASES> caseList = cs.GetData(foiaNumber).ToList();

Dictionary<int, string> NameDict = 
    caseList.ToDictionary(cases => cases.UID, cases =>     cases.NAME);


List<MyDataType> bindingGrdList = 
    caseList.SelectMany(x => x.ListObject)
        .Select(n => 
            new { 
                   SUBMITTER_NAME = NameDict[n.UID], 
                   NUMBER = n.UID, 
                   DATE_SENT = n.DATE_SENT, 
                   DATE_DUE = n.DATE_DUE, 
                   FINAL_DETERMINATION = n.FINAL_DETERMINATION 
                 }).ToList();

如何修复 AnonymousType 错误?谢谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    替换

    n => new { SUBMITTER_NAME = NameDict[n.UID], NUMBER = n.UID,
        DATE_SENT = n.DATE_SENT, DATE_DUE = n.DATE_DUE,
        FINAL_DETERMINATION = n.FINAL_DETERMINATION }
    

    n => new MyDataType { SUBMITTER_NAME = NameDict[n.UID], NUMBER = n.UID,
        DATE_SENT = n.DATE_SENT, DATE_DUE = n.DATE_DUE,
        FINAL_DETERMINATION = n.FINAL_DETERMINATION }
    

    【讨论】:

      【解决方案2】:

      尝试改用var

      var bindingGrdList = caseList.SelectMany(x => x.ListObject).Select(n => new { SUBMITTER_NAME = NameDict[n.UID], NUMBER = n.UID, DATE_SENT = n.DATE_SENT, DATE_DUE = n.DATE_DUE, FINAL_DETERMINATION = n.FINAL_DETERMINATION }).ToList();
      

      这将使它从您的代码中推断出类型,这就是您想要的匿名类型。

      【讨论】:

      • 当变量是方法的本地变量时很有用,尽管大多数时候结果将传递给调用者方法。
      • 他的问题的第一个版本仅提到bindingGrdList 的类型List。那时没有提到MyDataType。对于更新的问题,它应该是罗林回答它的方式。不过我想指出,对于 ASP.NET 控件之类的东西,它可能非常有用,绑定数据通常采用 object 的形式,它将吞噬任何 DataTableIEnumerable 数据源。在这些情况下,无需创建显式类。
      • 是的,我知道并且我投票赞成你的答案:-)
      【解决方案3】:

      您需要将投影从匿名类型更改为MyDataType。为此,您需要像这样更改Select

      List<MyDataType> bindingGrdList = 
          caseList.SelectMany(x => x.ListObject)
              .Select(n => 
                  new MyDataType 
                      { 
                         SUBMITTER_NAME = NameDict[n.UID], 
                         NUMBER = n.UID, 
                         DATE_SENT = n.DATE_SENT, 
                         DATE_DUE = n.DATE_DUE, 
                         FINAL_DETERMINATION = n.FINAL_DETERMINATION 
                       }).ToList();
      

      注意:我假设这些属性是 MyDataType 的正确属性,并且 MyDataType 具有默认的无参数构造函数。

      【讨论】:

        猜你喜欢
        • 2013-05-14
        • 1970-01-01
        • 2011-05-14
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多