Моя проблема связана с сложными многоразовыми логическими спецификациями.Передайте выражение в другое выражение как параметр
У меня есть следующие Expression
:
Expression<Func<User, bool>> userExp =
user => user.UserInRoles.Any(userInRole => userInRole.RoleId == SystemRoles.SysAdmin.Id);
И мне нужно, чтобы получить возможность:
new CommonContext().Set<Estate>().Where(estate => userExp.WithParameter(estate.CreatorUser)).ToList();
Так как я может передать Creator
из Estate
объекта в выражение, которое принимает на User
и, наконец, использовать окончательное выражение в linq to sql
?
Проблема заключается в том: WithParameter
EDIT:
Это один работает, но его не эффективно:
new CommonContext().Set<Estate>().ToList().Where(estate => userExp.Compile()(estate.CreatorUser)).ToList()
И следующий не ответ, потому что Invoke method
не может быть переведены в хранилище:
Expression<Func<User, bool>> userExp =
user => user.UserInRoles.Any(userInRole => userInRole.RoleId == SystemRoles.SysAdmin.Id);
Expression<Func<Estate, User>> propAccessor = estate => estate.ApprovedByUser;
var estateParam = Expression.Parameter(typeof(Estate));
var userParam = Expression.Invoke(propAccessor, estateParam);
var translatedExp = Expression.Invoke(userExp, userParam);
var result = (Expression<Func<Estate, bool>>)Expression.Lambda(translatedExp, estateParam);
var exceptionProvider = new CommonContext().Set<Estate>().Where(result).ToList();
Но мне нужно что-то, что можно перевести в Store Expression
Возможно, окончательное решение разлагается, а затем перекомпоновывает выражение, и если да, то как я могу его инкапсулировать для повторного использования в подобных ситуациях? (Как это то, что я пытаюсь сделать)
Если вы пытаетесь создать фильтры для повторного использования, вы можете посмотреть на https://entityrestsdk.codeplex.com/, в этом SDK, мы устанавливаем выражения сразу, однако, как вы это делаете, будет сложно отлаживать и поддерживать, поскольку вы не можете легко визуализировать свои фильтры. Поскольку эти правила не будут переписываться динамически, они остаются постоянными на протяжении всей жизни, поэтому лучше писать, поскольку они кажутся простыми в использовании и тестировании. –