/ / Zuordnen von Linq-Gruppen nach Ergebnissen zu einem Objekt - c #, linq, ienumerable

Zuordnen von Linq-Gruppen nach Ergebnissen zu einem Objekt - c #, linq, ienumerable

Ich habe eine Klasse, die als Zusammenfassung fungiert und als IEnumerable an eine MVC-Ansicht übergeben wird. Die Klasse sieht so aus:

public class FixedLineSummary
{
public long? CustomerId { get; set; }
public string CustomerName { get; set; }
public int? NumberOfLines { get; set; }
public string SiteName { get; set; }
}

Die Ergebnisse, die von der Datenbankbibliothek zurückgegeben werden, enthalten alle Einzeleinträge. Daher fasse ich diese mit linq zusammen:

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

Wenn ich versuche, die Ergebnisse in mein Objekt umzuwandeln, bekomme ich einfach einen Fehler, der

Instance argument: cannot convert from "System.Linq.IQueryable<AnonymousType#1>" to "System.Collections.Generic.IEnumerable<Domain.Entities.FixedLineSummary>"

Gibt es eine Möglichkeit, die Ergebnisse der linq-Abfrage in eine Auflistung meiner Klasse umzuwandeln?

Antworten:

5 für die Antwort № 1

Sie können den anonymen Typ nicht in umwandeln FixedLineSummary da beide nicht miteinander verwandt sind (für den Compiler). Stattdessen müssen Sie Instanzen Ihrer Klasse manuell erstellen:

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

6 für die Antwort № 2

Sie sollten die Projektion ändern, um Ihre Klasse zu erstellen, und nicht einen anonymen Typ:

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