博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
阅读量:7078 次
发布时间:2019-06-28

本文共 5409 字,大约阅读时间需要 18 分钟。

Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构建对应表的查询语句,即动态构建表达式树,这种操作一些被写在业务层上,我们可以在业务层需要进行数据集权限控制的地方,添加这种策略,下面具体分析说明一下.

看一下数据集权限表结果

public class User_DataSet_Policies    {        ///         /// 用户ID        ///         public int UserId { get; set; }        ///         /// 表名        ///         public string TableName { get; set; }        ///         /// 策略所需字段        ///         public string PolicyField { get; set; }        ///         /// 策略所需要值        ///         public string PolicyValue { get; set; }        ///         /// 策略操作符        ///         public string PolicyOperation { get; set; }    }

看一下,在程序中如何动态构建和使用我们的表达式树

       Expression
> exe = ExpressionExtensions.GenerateExpression
( new string[] { "Age", "UserName" }, new object[] { "12", "zzl" }, new string[] { "=", "=" }); userList.Where(exe.Compile()).ToList().ForEach(i => { Console.WriteLine(i.UserName); });

下面贡献一下GenerateExpression泛型方法的原码,大家可以把它添加到我们的LinqExtensions模块里

   ///     /// 表达式树的扩展    ///     public class ExpressionExtensions    {        ///         /// 构建表达式树        /// 调用:GenerateExpression(new string[]{"username"},new object[]{"zzl"},new string[]{"="});        ///         /// 
表类型
/// 字段名 /// 字段值 /// 操作符 ///
public static Expression
> GenerateExpression
(string[] keys, object[] values, string[] operation) { var TType = typeof(T); Expression expression_return = Expression.Constant(true); ParameterExpression expression_param = Expression.Parameter(TType, "p"); Expression expression; for (int i = 0; i < keys.Length; i++) { switch (operation[i]) { case "=": expression = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), TType.GetMethod("ToString")), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, expression); break; case "%": expression = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), typeof(string).GetMethod("Contains"), Expression.Constant(values[i], typeof(string))); expression_return = Expression.And(expression_return, expression); break; case ">": expression = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), typeof(double).GetType().GetMethod("GreaterThan"), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, expression); break; case "<": expression = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), typeof(double).GetType().GetMethod("LessThan"), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, expression); break; case ">=": expression = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), typeof(double).GetType().GetMethod("GreaterThanOrEqual"), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, expression); break; case "<=": expression = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), TType.GetProperty(keys[i]).GetType().GetMethod("LessThanOrEqual"), Expression.Constant(values[i])); expression_return = Expression.And(expression_return, expression); break; case "in": string[] strarr = values[i].ToString().Split(','); Expression or_return = Expression.Constant(false); for (int k = 0; k < strarr.Length; k++) { expression = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])), TType.GetMethod("ToString")), Expression.Constant(strarr[k])); or_return = Expression.Or(or_return, expression); } expression_return = Expression.And(expression_return, or_return); break; default: throw new ArgumentException("无效的操作符,目前只支持=,%,>,<,>=,<=,in"); } } return (Expression
>)Expression.Lambda
>(expression_return, new ParameterExpression[] { expression_param }); } }

对于动态构建表达式的介绍就到这里了,以后在使用过程中如果出现什么问题,请直接回复我.

转载地址:http://cldml.baihongyu.com/

你可能感兴趣的文章
个推微服务网关架构实践
查看>>
分布式系统一致性问题解决实战
查看>>
“十年磨一剑”--有赞的HBase平台实践和应用之路
查看>>
镭速raysync介绍文件传输软件的进史
查看>>
企业可以自己开发OA系统吗?会遇到什么问题?
查看>>
pageadmin CMS网站制作教程:附属表数据列表调用语法
查看>>
资政知识产权:爆款产品如何通过外观设计专利进行保护
查看>>
DataWorks 智能监控V2.2版本发布
查看>>
天猫双 11 背后:409 亿次安全保护,全链路保障每个购物场景
查看>>
官宣!vue.ant.design 低调上线
查看>>
HBase行键设计
查看>>
iView 3.4.0 发布,基于 Vue.js 的企业级 UI 组件库
查看>>
zabbix 查询剩余内存一直大于2G的主机
查看>>
技术负责人所需的四个核心能力,你具备几个?
查看>>
Kotlin 开发者社区
查看>>
【对讲机的那点事】带你玩转宝锋UV6R对讲机(二)
查看>>
Spring使用表单上传文件
查看>>
hcatalog简介和使用
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.12. 检查索引使用
查看>>
给容器服务的APIServer开放IPv6的访问
查看>>