Как объединить выражения объекта? - PullRequest
1 голос
/ 31 марта 2019

Мой вопрос: как мне объединить объект выражения, подобные этому?

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...