【问题标题】:How to convert Generic List<anonymous type > to Generic List <Classname>?如何将通用列表<匿名类型>转换为通用列表<类名>?
【发布时间】:2017-11-14 14:49:05
【问题描述】:

我有一个数据库,每“n”秒插入一次 CPU 使用率,我的任务是从数据库中获取最新的 CPU 条目。我想显示属于特定服务器的数据库中的最新 CPU 条目,并且我想将结果保存到通用列表中。

我尝试过的,

    string match = "ServerX"

    List<UsageCPU> cpus = (from a in db.UsageCPUs
                          where a.ServerID.Contains(match)
                          group a by a.ServerID into b
                          orderby b.Key
                          select new { ServerID = b.Key, 
                          Usage = b.FirstOrDefault() }).ToList();

我想循环遍历结果 cpus 以执行进一步的其他步骤。

但我收到以下错误

不能隐式转换类型 'System.Collections.Generic.List' 到 'System.Collections.Generic.List'。

编辑

更新 Satpal 的以下查询对我有用.. 但使用 var

   var cpus = (from a in db.UsageCPUs
                    where a.ServerID.Contains(match)
                    group a by a.ServerID into b
                    orderby b.Key
                    select new
                    {
                        ServerID = b.Key,
                        Usage = b.FirstOrDefault().Usage
                    }).ToList();

        foreach (var item in cpus)
        {
           if(bla bla..)
        }

请帮助!

【问题讨论】:

  • 请给出否决票的理由,以便我可以重构我的问题。谢谢!
  • 试试Usage = b.First().Usage

标签: c# linq


【解决方案1】:

使用

List<UsageCPU> cpus = (from a in db.UsageCPUs
                      where a.ServerID.Contains(match)
                      group a by a.ServerID into b
                      orderby b.Key
                      select new UsageCPU  //Added UsageCPU  
                      { 
                          ServerID = b.Key, 
                          Usage = b.FirstOrDefault().Usage 
                      }).ToList();

根据错误更新

无法在 LINQ to Entities 查询中构造实体

List<UsageCPU> cpus = (from a in db.UsageCPUs
                      where a.ServerID.Contains(match)
                      group a by a.ServerID into b
                      orderby b.Key
                      select new 
                      { 
                          ServerID = b.Key, 
                          Usage = b.FirstOrDefault().Usage
                      })
                    .AsEnumerable()
                    .Select(x => new UsageCPU  
                    {
                       ServerID ,
                       Usage            
                    }).ToList();

【讨论】:

    【解决方案2】:

    尝试选择一个不是新的 当您选择 new 时,您会得到无法转换为 UsageCPU 类型的匿名类型

     (from a in db.UsageCPUs
     where a.ServerID.Contains(match)
     group a by a.ServerID into b
     orderby b.Key
     select a)
    

    或者使用 var 然后循环遍历结果

    var cpus = (from a in db.UsageCPUs
                          where a.ServerID.Contains(match)
                          group a by a.ServerID into b
                          orderby b.Key
                          select new { ServerID = b.Key, 
                          Usage = b.FirstOrDefault() }).ToList();
    

    【讨论】:

    • 你的意思是,循环通过cpus?
    • 是的。关于 'b.FirstOrDefault(x => x.Usage)' lambda 表达式必须返回类似于 'x => x.Usage == anyval' 的布尔值,或者在没有 lamda 的情况下使用它
    • 仍然没有运气,我得到了同样的错误 - 无法在 b.FirstOrDefault(x=> x.Usage) 处将类型 'double' 隐式转换为 'bool'
    • 因为 'x.Usage' 是 double 而不是 bool。您需要括号中的 lambda 表达式中的布尔表达式 msdn.microsoft.com/en-us/library/bb549039.aspx
    • @demo_user:我猜b.FirstOrDefault().Usage是你想要的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多