在不使用WCF数据服务的情况下在实体框架中查询拦截器

时间:2011-10-11 17:47:42

标签: entity-framework

我正在使用EF 4.1 Code First方法。我不希望使用WCF数据服务。我还可以实现Query拦截器吗?任何关于此的指示都将受到高度赞赏。谢谢!

1 个答案:

答案 0 :(得分:3)

没有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(...)
                };

顺便说一下。 WCF数据服务也无法解决导航属性。