Нет, EF вообще не предлагает перехватчиков запросов. Это чисто дополнение служб данных WCF. Вы должны реализовать свою собственную инфраструктуру для такой логики, но у меня есть некоторые сомнения, что это выполнимо на глобальном уровне.
Вы можете сделать что-то подобное в вашем контексте:
public IQueryable<Client> ClientsQuery(IPrincipal principal)
{
if (prinicipal.IsInRole("Admin")
{
return this.Clients;
}
else
{
return this.Clients.Where(...);
}
}
Ну, это не очень хорошо, потому что оно перемещает бизнес-логику на уровень доступа к данным и жестко закодировано. Большая проблема в том, что он работает, только если вы используете ClientsQuery
в верхнем слое вместо Clients
напрямую. Еще хуже то, что он работает только для прямых запросов, но не для отношений. Поэтому, если у вас есть, например, сущность Product
, содержащая свойство навигации для всех клиентов, которые когда-либо покупали продукт, это свойство навигации никогда не будет фильтроваться по вашему условию, поскольку EF вообще не поддерживает фильтрацию свойств навигации.
Нет общего решения этой проблемы. Ваша бизнес-логика должна обрабатывать это, добавляя правильные условия там, где это необходимо, и используя проекции в случае фильтрации свойств навигации, таких как:
var query = from p in context.Products
where ...
select new
{
Name = p.Name,
Clients = p.Clients.Where(...)
};
Btw. Свойства навигации также не определяются службами данных WCF.