Перехватчик запроса для возврата true, если объект находится в списке элементов в службах данных ado.net - PullRequest
1 голос
/ 09 апреля 2009

Я использую службы данных ado.net и хочу реализовать защиту на уровне строк в перехватчике запросов, чтобы ограничить данные только возвратом данных, которые пользователь может видеть. Сложность заключается в том, что имя пользователя для пользователя находится в другой таблице. Поэтому я подумал, что могу получить список событий, которые пользователь может видеть в соответствии с записью в таблице OnlineSubscription для этого пользователя, а затем вернуть, соответствует ли текущее событие каким-либо записям, которые возвращаются следующим образом:

[QueryInterceptor("Events")]
public Expression<Func<Events, bool>> QueryEvents()
{

  var allowedEventList = (from os in context.OnlineSubscription
                          from e in os.Events
                         where os.UserName == HttpContext.Current.User.Identity.Name
                         select e;

return e => events.Intersect(new List<Events>
                                         {
                                                 e
                                         }).Any();
}

Однако это вызывает исключение «Не реализовано». Итак, мой вопрос: есть ли правильный способ сравнить текущую сущность со списком сущностей в перехватчике запросов?

РЕДАКТИРОВАТЬ: Я также пытался:

return e => events.Any(evnt => evnt.Event_Key == e.Event_Key);

безуспешно (снова получая исключение «Не реализовано»).

Ответы [ 2 ]

2 голосов
/ 17 апреля 2009

Очевидно, что это не удается, потому что с помощью лямбда-выражения events.Any ... он уже запрашивает в начальном контексте (т. Е. Запрашивает прямые события), а затем, когда вы добавляете events.Any, он также пытается выполнить запрос на новый контекст (т. е. вложенный «from» событий в OnlineSubscription), поэтому он по понятным причинам выдает исключение.

Я тогда использовал:

[QueryInterceptor("Events")]
public Expression<Func<Events, bool>> QueryEvents()
{    
    return e => e.OnlineSubscription.Any(os => os.UserName == HttpContext.Current.User.Identity.Name);
}

Что работает, поскольку это просто запрос в том же контексте, что и первоначальный запрос, и просто прохождение через отношения.

0 голосов
/ 03 июля 2009

В самом деле? Я получаю исключение "Не реализовано" с этим кодом:

[QueryInterceptor("Products")]
public Expression<Func<Product, bool>> QueryProducts()
{
    return p => p.User.Username == HttpContext.Current.User.Identity.Name;
}

Работает нормально, если я фильтрую по свойству объекта Product, но не по каким-либо его отношениям.

...