Berücksichtigung dieser Beispielklassenstruktur -
public class Apprentice
{
public Guid Id { get; set; }
public string GivenName { get; set; }
public string FamilyName { get; set; }
public virtual ICollection<ApprenticeAddress> Addresses { get; set; }
}
public class ApprenticeAddress
{
public Guid Id { get; set; }
public Guid ApprenticeId { get; set; }
public virtual Apprentice Apprentice { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string Town { get; set; }
public Guid CountyId { get; set; }
public virtual County County { get; set; }
public string PostCode { get; set; }
public bool IsPrimaryAddress { get; set; }
public Guid AddressTypeId { get; set; }
public virtual AddressType AddressType { get; set; }
}
Basierend auf der obigen Dokumentation und der bereitgestellten Beispielklassenstruktur hatte ich Probleme, einen dynamischen Selektor für die Auswahl zufälliger Eigenschaften zu kompilieren, die zur Laufzeit nicht bekannt sind. Das Hauptproblem, das ich hatte, ist die Auswahl der AddressLine1- Eigenschaft aller Adressen, die mit dem zurückgegebenen Lehrling verknüpft sind.
In diesem Beispiel führt LINQ select das aus, was ich tun muss, aber kann jemand helfen, dies in eine Datenobjekt-Initialisierungszeichenfolge umzuwandeln?
var r = repo.GetAll().ToList().Select(x =>
new
{
x.FamilyName,
addresses = x.Addresses.SelectMany(y => y.AddressLine1)
});
AKTUALISIEREN
Wenn ich die folgende Code- und Datenobjekt-Initialisierungszeichenfolge verwende, die an die Select-Erweiterungsmethode übergeben wird, erhalte ich das gewünschte anonyme Objekt:
var whereTxt = "Active";
var selectTxt = "new (GivenName AS GivenName,FamilyName AS FamilyName)";
var repo = Storage.DataContext.GetRepository<Apprentice>();
return repo.GetAll().Where(whereTxt).Select(selectTxt).AsQueryable();
Das Problem besteht darin, die Syntax zum Abrufen bestimmter Eigenschaften (zur Laufzeit nicht bekannt) aus verschachtelten Sammlungen zu bestimmen
Dies kann einfach mit System.Linq.Dynamic.Core erfolgen :
var data = new[]
{
new Apprentice { FamilyName = "f", Addresses = new [] { new ApprenticeAddress { AddressLine1 = "address x" }, new ApprenticeAddress { AddressLine1 = "address y" } } }
}.AsQueryable();
var result = data.Select(x => new { x.FamilyName, Addresses = x.Addresses.Select(y => y.AddressLine1) });
Console.WriteLine("result: " + JsonConvert.SerializeObject(result, Formatting.Indented));
var resultDynamic = data.Select("new (FamilyName as FamilyName, Addresses.Select(AddressLine1) as Addresses)");
Console.WriteLine("resultDynamic: " + JsonConvert.SerializeObject(resultDynamic, Formatting.Indented));
Ein ausführliches Beispiel finden Sie unter ConsoleApp2
unter https://github.com/StefH/System.Linq.Dynamic.Core.TestApps
Beachten Sie, dass Addresses.SelectMany(y => y.AddressLine1)
falsch ist. Addresses.SelectMany(y => y.AddressLine1)
die Zeichen aus der Adresse ausgewählt.