Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql linq到sql查询拦截器_Linq To Sql_Interceptor - Fatal编程技术网

Linq to sql linq到sql查询拦截器

Linq to sql linq到sql查询拦截器,linq-to-sql,interceptor,Linq To Sql,Interceptor,我正在考虑实现一些LINQ到SQL,但我很难看到我们将如何添加访问控制业务规则,例如客户a只能查看他们的订单。 在ado.net data services中,查询转接器完全按照我的要求进行操作,并且可以查看如何检查更新/插入/删除,但是否有类似的功能: [QueryInterceptor("Orders")] public IQueryable<Orders> OnQueryOrders(IQueryable<Orders> orderQuery) {

我正在考虑实现一些LINQ到SQL,但我很难看到我们将如何添加访问控制业务规则,例如客户a只能查看他们的订单。 在ado.net data services中,查询转接器完全按照我的要求进行操作,并且可以查看如何检查更新/插入/删除,但是否有类似的功能:

[QueryInterceptor("Orders")] 
public IQueryable<Orders> OnQueryOrders(IQueryable<Orders> orderQuery) 
{ 

      return from o in orderQuery 
         where o.Customers.ContactName == HttpContext.Current.User.Identity.Name 
         select o; 
} 
或者我需要通过访问器沿着以下线路进行控制:
GetOrdersByCustomerstring customerId

我认为,在这种情况下,更好的解决方案是构建一个真正的业务层,它位于应用程序层和LINQ to SQL类之间


然后,您将查询您的业务层,而业务层又将实现您的所有业务逻辑和过滤。如果架构设计得当,那么业务层对任何编码应用层的人都相当透明,那么每个人都会很高兴。

就我个人而言,我发现像GetOrdersByCustomer这样的东西更容易理解和维护。拦截器在这里感觉不必要的复杂性。想想下一个需要维护你的代码的人,他可能没有你那么聪明。对于简单的场景来说,这很好,但我想允许更丰富的查询构建,这样很快就会有100个访问器,这反过来又会让维护或重构变得混乱/出错/噩梦。虽然拦截器可能会让人困惑,但它们确实允许关键的代码关注点一致地运行——但我认为Justin的想法更接近我们最终的结果Hi Justin是的,这看起来是我必须走的路线。我的方法看起来是这样的:将我的dataContext密封起来,但我的数据对象是公共的,即linq到sql中的表从BL中公开方法,这些方法可以接受谓词函数,然后这些谓词函数将被添加到带有业务安全逻辑的表达式树中。在我的原型中,这是可行的,虽然一开始有点混乱,但公开的内容非常清晰但灵活。根据应用程序的范围和性质,创建一个完整的BL可能不实用。LINQtoSQL能够自行处理业务规则验证。您可以使用分部类拦截数据操作,以实现与ADO.NET查询拦截器类似的目标。查看本文: