Дерево выражений для построения результатов подбора
Я пытаюсь построить подзапрос, используя деревья выражений. В 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())
});