如何将Generic List<匿名类型>转换为Generic List<Class名称>?

6
我有一个数据库,其中每隔'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<AnonymousType#1>'隐式转换为'System.Collections.Generic.List<FNC_RAQIT_HM_UI.UsageCPU>'。

编辑
图片中的查询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..)
        }

请帮忙!!

请给出下投票的原因,这样我就可以重构我的问题。谢谢! - demo_user
尝试 Usage = b.First().Usage - Satpal
2个回答

12

使用

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();

3

尽量选择非新的选项,当您选择新选项时,将获得匿名类型,无法转换为UsageCPU类型。

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

或者使用变量,然后遍历结果。
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();

你的意思是循环遍历 CPU 吗? - demo_user
关于“b.FirstOrDefault(x => x.Usage)”的lambda表达式必须返回布尔值,例如“x => x.Usage == anyval”,或者可以在不使用lambda的情况下使用它。 - Guru Stron
仍然没有成功,我得到了同样的错误 - 无法将类型“double”隐式转换为“bool”,在 b.FirstOrDefault(x => x.Usage) 处。 - demo_user
因为 'x.Usage' 是 double 而不是 bool。你需要在 lambda 表达式中使用布尔表达式,放在括号里。http://msdn.microsoft.com/zh-cn/library/bb549039.aspx - Guru Stron
尝试使用以下代码: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(); 然后使用 'foreach(var x in cpus ){ x.ServerID; x.Usage}' - Guru Stron
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接