我正在建立一个授权策略,该策略将在一个巨大的数据库表中以记录级别检查具有各种属性的各种实体(因此,不能选择简单的Func)。
我的问题是,作为表达式新手我不能采取的措施如下:
让我们有一个简单的实体:
public class Entity1
{
public int Foo1 { get; set; }
}
我为每个实体都有一个缓存的属性选择器,对于这个实体,它将是:
Expression<Func<Entity1, int>> propertySelector = i => i.Foo1;
另一方面,我需要比较此属性的值来更改整数列表:
List<int> ids = new List<int> { 1, 2, 3 };
将该列表与属性选择器“组合”之后,我需要具有以下表达式:
Expression<Func<Entity1, bool>> validator = i => ids.Contains(i.Foo1);
因此在EF上
IQueryable<Entity1> entities = null;
我可以使用
var result = entities.Where(validator);
要获得理想的结果。
问题是如何获得“验证器”表达式,该表达式将预定义的属性选择器和整数列表(如果可能的话,不使用反射)或将其缓存(如果整数列表的内容发生更改,则必须将其反映)组合在一起。