将Linq Group按结果映射到对象

Gra*_*Roy 2 c# linq ienumerable

我有一个作为摘要的类,它将作为IEnumerable传递给MVC视图.该课程如下:

public class FixedLineSummary
{
    public long? CustomerId { get; set; }
    public string CustomerName { get; set; }
    public int? NumberOfLines { get; set; }
    public string SiteName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从db返回的结果包含所有单个条目,因此我使用linq来总结这些:

var summary = (from r in result 
              let k = new {r.CustomerId, CustomerName = r.CompanyName, r.SiteName}
              group r by k into t
              select new 
              {
                  t.Key.CustomerId,
                  t.Key.CustomerName,
                  t.Key.SiteName,
                  Lines = t.Sum(r => r.lines)
              });
Run Code Online (Sandbox Code Playgroud)

当我尝试将结果转换为我的对象时,我只是不断收到错误:

Instance argument: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<Domain.Entities.FixedLineSummary>'
Run Code Online (Sandbox Code Playgroud)

有没有办法将linq查询的结果转换为我的类的可枚举?

Ahm*_*eed 6

您应该更改投影以创建您的类,而不是匿名类型:

var summary = from r in result 
              let k = new {r.CustomerId, CustomerName = r.CompanyName, r.SiteName}
              group r by k into t
              select new FixedLineSummary
              {
                  CustomerId = t.Key.CustomerId,
                  CustomerName = t.Key.CustomerName,
                  SiteName = t.Key.SiteName,
                  NumberOfLines = t.Sum(r => r.lines)
              };
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

您不能转换匿名类型,FixedLineSummary因为它们根本不相关(对于编译器).相反,您需要手动创建类的实例:

IEnumerable<FixedLineSummary> summaries = summary
   .Select(s => new FixedLineSummary
   {
        CustomerId = s.CustomerId,
        CustomerName = s.CustomerName,
        NumberOfLines = s.NumberOfLines,
        SiteName = s.SiteName
   })
   .ToList();
Run Code Online (Sandbox Code Playgroud)