Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构建对应表的查询语句,即动态构建表达式树,这种操作一些被写在业务层上,我们可以在业务层需要进行数据集权限控制的地方,添加这种策略,下面具体分析说明一下.
看一下数据集权限表结果
public class User_DataSet_Policies
{
/// <summary>
/// 用户ID
/// </summary>
public int UserId { get; set; }
/// <summary>
/// 表名
/// </summary>
public string TableName { get; set; }
/// <summary>
/// 策略所需字段
/// </summary>
public string PolicyField { get; set; }
/// <summary>
/// 策略所需要值
/// </summary>
public string PolicyValue { get; set; }
/// <summary>
/// 策略操作符
/// </summary>
public string PolicyOperation { get; set; }
}
看一下,在程序中如何动态构建和使用我们的表达式树
Expression<Func<User, bool>> exe = ExpressionExtensions.GenerateExpression<User>(
new string[] { "Age", "UserName" },
new object[] { "", "zzl" },
new string[] { "=", "=" });
userList.Where(exe.Compile()).ToList().ForEach(i =>
{
Console.WriteLine(i.UserName);
});
下面贡献一下GenerateExpression泛型方法的原码,大家可以把它添加到我们的LinqExtensions模块里
/// <summary>
/// 表达式树的扩展
/// </summary>
public class ExpressionExtensions
{
/// <summary>
/// 构建表达式树
/// 调用:GenerateExpression(new string[]{"username"},new object[]{"zzl"},new string[]{"="});
/// </summary>
/// <typeparam name="T">表类型</typeparam>
/// <param name="keys">字段名</param>
/// <param name="values">字段值</param>
/// <param name="operation">操作符</param>
/// <returns></returns>
public static Expression<Func<T, bool>> GenerateExpression<T>(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 = ; 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 = ; 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<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });
}
}
对于动态构建表达式的介绍就到这里了,以后在使用过程中如果出现什么问题,请直接回复我.
Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制的更多相关文章
- C#动态构建表达式树(三)——表达式的组合
C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. ...
- C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式
C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...
- C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式
C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...
- 泛型方法动态生成表达式树 Expression
public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...
- Lind.DDD.DynamicModules动态模块化的设计
回到目录 在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大 ...
- 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。
CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...
- ahjesus动态生成表达式树
直接上方法,看的懂的拿去用,看不懂的找资料看懂 , , Double floorprice = , Double topprice = , string brandstr = "" ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- 表达式树在LINQ动态查询
动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...
随机推荐
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
- php单条件查询,关键字查询
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
Atitit 图像处理 深刻理解梯度原理计算.v1 qc8 1.1. 图像处理 梯度计算 基本梯度 内部梯度 外部梯度 方向梯度1 2. 图像梯度就是图像边缘吗?2 1.1. 图像处理 梯度计算 ...
- Nginx配置文件解析
user nginx nginx; #定义Nginx运行的用户和用户组 worker_processes 1; #nginx进程数,建议设置为等于CPU总核心数 worker_rlimit_nofil ...
- c#字段
1.C#中是不允许用new操作符创建String对象的,编译器会报错. 2.实例字段:使用new对class创建对象直接赋初始值,不适用于struct slass Rect { public int ...
- Android启动icon切图大小
我们在给app切图的时候不知道告诉ui启动图标切多大,其实你新建一个android项目就知道应该切多大了.新建一个项目会产生几种大小的启动图标. 我把各个文件夹下的ic_launcher.png文件都 ...
- android帧动画,移动位置,缩放,改变透明度等动画讲解
1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...
- Android样式之selector
日常开发当中,难免会出现这样一种情况,为一个按钮.TextView...设置一个点击状态的颜色改变,可能是background背景的改变,也可能是字体颜色的改变,简单点说:默认状态下,字体颜色或者背景 ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- C#文件相同性判断
在进行开发时,对文件进行上传和下载是较为普遍的行为,为了防止在文件操作过程中,出现同一文件多次操作,需要对文件进行相同性比较: 1.获取文件的绝对路径,针对window程序和web程序都可使用: // ...