我正在使用EF5、工作单元和仓储模式。我希望为指定的用户定义一些访问数据的限制。在数据库中,我设计了一个名为EntityProperties的表来保存实体名称及其属性,另一个名为PropertyValues的表来保存这些属性的值,每个EntityProperty都有一个或多个PropertyValues。
在业务层中,当用户请求数据时,如果为他定义了任何限制,则应向linq语句添加一些条件。我所做的是通过“userId”获取实体名称及其属性和值的列表,然后将一些“Where”子句添加到linq查询中。
但是,实体名称和它们的属性都是“String”类型,因此我应该使用反射来管理它们。但我不知道这部分,也不知道如何从给定的一组条件字符串创建LINQ where子句。
例如,假设一个用户请求订单列表,用户ID为5。我首先查询那些访问限制表,结果是:
"Order","Id","74"
"Order","Id","77"
"Order","Id","115"
这意味着这个用户只能看到这三个订单,而在Orders表中,我们有更多的订单。因此,如果我想使用LINQ查询来获取订单,就像:
在业务层中,当用户请求数据时,如果为他定义了任何限制,则应向linq语句添加一些条件。我所做的是通过“userId”获取实体名称及其属性和值的列表,然后将一些“Where”子句添加到linq查询中。
但是,实体名称和它们的属性都是“String”类型,因此我应该使用反射来管理它们。但我不知道这部分,也不知道如何从给定的一组条件字符串创建LINQ where子句。
例如,假设一个用户请求订单列表,用户ID为5。我首先查询那些访问限制表,结果是:
"Order","Id","74"
"Order","Id","77"
"Order","Id","115"
这意味着这个用户只能看到这三个订单,而在Orders表中,我们有更多的订单。因此,如果我想使用LINQ查询来获取订单,就像:
var orders = from order in Context.Orders
我需要将它转换成类似于以下内容:
var orders = from order in Context.Orders
// 订单ID应该在74、77、115之间
然而,从“Order”和“Id”字符串获取订单实体和ID属性需要使用反射。因此有两个问题:
最佳方法是如何从字符串中获得强类型? 有没有更好的方法可以提高性能?
Contains
在一个int
字段上。但是你会有其他类型的限制吗? - Raphaël Althaus