Дерево выражений для построения результатов подбора

Я пытаюсь построить подзапрос, используя деревья выражений. В linq я бы написал что-то вроде:

var single = MyTable
    .AsExpandable()
    .Select(c => new
    {
        Childs = Enumerable.Select(
            MyTable.VisibleChilds.Invoke(c, dbContext),
            cc => Convert(cfg.ChildsConfig).Invoke(dbContext, cc))
    });

где Convert строит выражение как

p => new MyTableSelect {
    Id = p.Id,
    Name = p.Name
}

в зависимости от заданных значений из конфигурации (только для чтения необходимых данных из базы данных).

но я борюсь со вторым параметром, который будет передан Select звони как мне нужно cc быть переданным в Convert-call.

Я думаю, мне нужно что-то вроде Expression.Lambda<Func<>> но я этого не вижу

Expression.Lambda>(Expression.Invoke(Instance.Convert(cfg.ChildOrganizersFilterConfig), ContextParameter, theEntity));

1 ответ

Я не знаком с вашим использованием Invoke, но если вы просто хотите запустить "Конвертер" в свободном синтаксисе для использования в выражении Linq, я мог бы показать вам пример этого. Скажем, у меня есть три класса POCO, один родительский контейнер, дочерний контейнер и контейнер, в который я хочу преобразовать.

public class POC
{
    public int Id { get; set; }
    public string Name { get; set; }

    public POC(int id, string name)
    {
      Id = id;
      Name = name;
    }
}

public class ChildPOC
{
    public int ParentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ChildPOC(int parentId, string firstName, string lastName)
    {
      ParentId = parentId;
      FirstName = firstName;
      LastName = lastName;
    }
}
public class ChildPOCAlter
{
    public int ParentId { get; set; }
    public string Name { get; set; }

    public ChildPOCAlter(string first, string last, int parentId)
    {
      ParentId = parentId;
      Name = $"{first} {last}";
    }
}

Я мог бы написать метод преобразователя для преобразования ChildPOC в ChildPOCAlter следующим образом:

public static Converter<ChildPOC, ChildPOCAlter> ChildPOCOAlter()
{
  return new Converter<ChildPOC, ChildPOCAlter>((x) => { return new ChildPOCAlter(x.FirstName, x.LastName, x.ParentId); });
}

Я мог бы затем заполнить некоторые данные:

var someParents = new List<POC> { new POC(1, "A"), new POC(2, "B") };
var somechildren = new List<ChildPOC> { new ChildPOC(1, "Brett", "x"), new ChildPOC(1, "Emily", "X"), new ChildPOC(2, "John", "Y") };

И тогда я могу захотеть взять эти отношения и применить конвертер непосредственно к нему:

var relationships = someParents.Select(x => new
{
    Id = x.Id,
    Name = x.Name,
    Children = somechildren.Where(y => y.ParentId == x.Id).ToList().ConvertAll(ChildPOCOAlter())
});
Другие вопросы по тегам