Я пытаюсь преобразовать следующую строку запроса Entity Framework в обобщенный метод расширения stati c:
dbContext.Employees
.Where(e => permissionResolver.AuthorizedUsers.Select(p => p.Id).Contains(e.Id))
.OrderBy(...)
PermissionResolver
- это просто экземпляр, я получаю список идентификаторов от до сравнить с идентификатором пользователя, хранящимся в текущей записи. Он отлично компилируется в оператор SQL WHERE Id IN (....)
.
Теперь я пытаюсь создать метод расширения для IQueryable<T>
, который я могу использовать для любого типа записи, я просто хочу передать свойство, в котором хранится идентификатор владельца.
Итак, вот что я придумал:
public static IQueryable<T> AuthorizedRecords<T>(this IQueryable<T> query, Expression<Func<T, Int32>> property, IPermissionResolver permissionResolver)
{
Expression<Func<T, Boolean>> idIsAuthorized = entity => permissionResolver.AuthorizedUsers.Select(e => e.Id).ToList().Contains(property.Compile()(entity));
return query.Where(idIsAuthorized);
}
Я получаю сообщение об ошибке выполнения, что это выражение не может быть преобразовано в SQL.
Как я могу объединить выражение свойства с основным выражением запроса, чтобы его можно было правильно преобразовать в SQL? Есть ли лучший способ переписать выражение запроса?