Мой вопрос: как мне объединить объект выражения, подобные этому?
Func<T, object>
Я создал тестовый проект на GitHub, где я показываю, что у меня естьпытался.
У меня есть базовая логическая комбинация выражений, подобная этой здесь рабочая
Expression<Func<Employee, bool>> filter1 = p => p.Name == "John Doe";
Expression<Func<Employee, bool>> filter2 = p => p.Address == "Address 123";
// Two boolean expressions combined
Expression<Func<Employee, bool>> filterCombined = filter1.And(filter2);
// Works as expected
filterCombined.Body.ToString().ShouldBe("((p.Name == \"John Doe\") And (p.Address == \"Address 123\"))");
НО что я не могуначать работать - это объединить два объекта таких, как здесь
Expression<Func<Employee, object>> filter1 = p => p.Info;
Expression<Func<Employee, object>> filter2 = p => p.Profile;
// Trying to combine two object expressions fails
Expression<Func<Employee, object>> filterCombined = ParameterToMemberExpressionRebinder.CombinePropertySelectorWithPredicate(filter1, filter2);
filterCombined.Body.ToString().ShouldBe("((p => p.Info And p => p.Profile))"); //Something like this anyway...
Я пробовал все виды вещей, таких как vistor pattern , LinqKit и т. Д., Но я что-то упускаю.
Моя основная причина сделать все это
Эта информация не является строго необходимой для этого вопроса, номожет дать кому-то дополнительную информацию, а мне несколько других ответов.
Мне нужно это для Entity Framework Включите для загрузки связанных данных .Но помимо этого Automapper не может отобразить следующее, поэтому я пытаюсь взять все параметры и объединить их в один, который Automapper может затем обработать.
public MyModelDTO GetById(int? id, params Expression<Func<MyModelDTO , object>>[] includeExpressions)
{
// here Automapper (with Automapper.Extension.ExpressionMapping)
// fails to do the mapping so I´m trying to combine them into one
Expression<Func<MyModel, object>> mappedExpression= MapToType<Expression<Func<MyModel, object>>>(includeExpressions);
// call the repository with EF expression
var myModel = MyRepoGetById(id,mappedExpression);
...map myModel back to dto
return myMappedDtoModel;
}
// The repository method
public MyModel MyRepoGetById(int id, params Expression<Func<MyModel, object>>[] includeExpressions)
{
if (includeExpressions.Any())
{
IQueryable<T> set = includeExpressions
.Aggregate<Expression<Func<T, object>>, IQueryable<T>>
(dbContext.Set<T>(), (current, expression) => current.Include(expression));
return await set.SingleOrDefaultAsync(s => s.Id == id);
}
return dbContext.Set<T>().Find(id);
}
, который я хочу использовать следующим образом
var result = await service.GetById(id,x => x.ClassProperty, x => x.AnotherClassProperty);