回到目录

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动态构建表达式树,实现对数据集的权限控制的更多相关文章

  1. C#动态构建表达式树(三)——表达式的组合

    C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. ...

  2. C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式

    C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...

  3. C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式

    C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...

  4. 泛型方法动态生成表达式树 Expression

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  5. Lind.DDD.DynamicModules动态模块化的设计

    回到目录 在Lind.DDD框架里有Module,主要用于全局自动添加的模块,它类似于ABP系统里的Module,但有时过于自动化了可能使系统太死板,而有时将需要的模块手动载入可能对我们更合适,所以大 ...

  6. 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。

    CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...

  7. ahjesus动态生成表达式树

    直接上方法,看的懂的拿去用,看不懂的找资料看懂 , , Double floorprice = , Double topprice = , string brandstr = "" ...

  8. Lind.DDD敏捷领域驱动框架~介绍

    回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...

  9. 表达式树在LINQ动态查询

    动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...

随机推荐

  1. 通过对表格数据的选择对input的value进行修改

    通过对表格数据的选择对input的value进行修改 $(function(){ $("#tb_gys").datagrid({ url:'getGysinfoList.actio ...

  2. UpdateData(TRUE)与UpdateData(FALSE)的使用

    二者是更新对话框的控件与变量. 1.先要建立对应关系 如 编辑框IDC_Edit  和 变量 m_name DDX_Text(pDX, IDC_EDIT, m_name); 2.若是在编辑框输入名字 ...

  3. 【Win 10开发】协议-上篇:自定义应用协议

    就像系统许多内置应用可以通过URI来启动(如ms-settings-bluetooth:可以打开蓝牙设置页),我们自己开发的应用程序,如果需要的话,可以为应用程序自定义一个协议.应用程序协议在安装时会 ...

  4. 网络连接详细信息出现两个自动配置ipv4地址

    问题:网络连接详细信息出现两个自动配置ipv4地址,一个是有效地址,一个是无效地址. 解决办法:先将本地连接ip设置成自动获取,然后点击开始——>运行——>输入cmd,回车,进入命令行界面 ...

  5. 深入理解脚本化CSS系列第三篇——脚本化CSS类

    前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...

  6. 创建第一个 local network(II)- 每天5分钟玩转 OpenStack(81)

    上一节通过 Web GUI 创建了 “first_local_net”,本节我们需要搞清楚底层网络结构有了哪些变化? 点击 “first_local_net” 链接,显示 network 的 subn ...

  7. IE内核发送ajax请求时不会将url中的参数编码

    有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...

  8. EntityFramework 7 Join Count LongCount 奇怪问题(已修复)

    问题说明: 博客问题纪录 Use EF7, Linq Join Count is error EF7 Code Commit EF7 版本(注意 rc): 旧版本:"EntityFramew ...

  9. EF7 Code First Only-所引发的一些“臆想”

    At TechEd North America we were excited to announce our plans for EF7, and even demo some very early ...

  10. Hive Tutorial(上)(Hive 入门指导)

    用户指导 Hive 指导 Hive指导 概念 Hive是什么 Hive不是什么 获得和开始 数据单元 类型系统 内置操作符和方法 语言性能 用法和例子(在<下>里面) 概念 Hive是什么 ...