我正在使用EF 4.1 Code First方法。我不希望使用WCF数据服务。我还可以实现Query拦截器吗?任何关于此的指示都将受到高度赞赏。谢谢!
答案 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数据服务也无法解决导航属性。