Динамические выражения LINQ Select - SelectMany из вложенной коллекции - PullRequest
0 голосов
/ 17 октября 2018

Документы по динамическим выражениям

Принимая во внимание эту примерную структуру класса -

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

Исходя из вышеприведенной документации и предоставленной примерной структуры класса, я изо всех сил пыталсяскомпилировать динамический селектор для выбора случайных свойств, не известных во время выполнения.Основная проблема, с которой я столкнулся, заключается в выборе, скажем, свойства AddressLine1 для любых адресов, связанных с возвращенным учеником.

В этом примере LINQ select выполнит то, что мне нужно, но может кто угоднопомогите преобразовать это в строку инициализатора объекта данных?

var r = repo.GetAll().ToList().Select(x =>
        new
        {
            x.FamilyName,
            addresses = x.Addresses.SelectMany(y => y.AddressLine1)
        });

UPDATE

Если я использую следующий код и строку инициализатора объекта данных, переданную в метод расширения Select,Я получаю анонимный объект, который мне нужен -

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

Проблема, с которой я сталкиваюсь, заключается в определении синтаксиса получения определенных свойств (не известных во время выполнения) из вложенных коллекций

1 Ответ

0 голосов
/ 21 октября 2018

Это легко сделать, используя System.Linq.Dynamic.Core :

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

Полный рабочий пример см. ConsoleApp2 в https://github.com/StefH/System.Linq.Dynamic.Core.TestApps

Обратите внимание, что Addresses.SelectMany(y => y.AddressLine1) неверно, это выбирает символы из адреса.

...