1

我正在使用 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);

没有任何成功(再次获得“未实施”异常)。

4

2 回答 2

2

显然这失败了,因为通过使用 lambda 表达式 events.Any... 它已经在初始上下文中查询(即直接查询事件),然后当您添加 events.Any 子句时,它还尝试查询新上下文(即 OnlineSubscription 中事件的嵌套“来自”),因此它可以理解地引发异常。

然后我用:

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

这很有效,因为这只是在与初始查询相同的上下文中进行查询,并且只是遍历关系。

于 2009-04-17T04:38:02.447 回答
0

真的吗?我收到此代码的“未实现”异常:

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

如果我通过 Product 对象本身的属性进行过滤,但不是通过它的任何关系进行过滤,它工作正常。

于 2009-07-03T01:05:20.773 回答