Linq 实现字符串转Lambda表达式(公式动态求值)

需求说明

最近在开发项目过程中,碰到一个需求是需要获取数据库中的动态公式字符串字段,通过 Linq 写法转换成 Lambda 表达式来进行取值计算(原来是通过存储过程实现,则不需要这么复杂)。

本文通过引用 DynamicExpresso库 实现动态公式的转换,这里简单记录下笔记。

实现步骤

1、VS项目菜单栏选择:工具 -> NuGet 包管理器 -> 管理解决方案的NuGet程序包

或者 项目解决方案右键直接选择 “管理解决方案的NuGet程序包

2、输入 “DynamicExpresso” 进行搜索,选择第一个进行安装

Linq 实现字符串转Lambda表达式(公式动态求值)

搜索类库安装

3、创建 LambdaParsers 类,用于编写字符串转 Lambda 表达式的公共方法

public class LambdaParsers
    {
        /// 
        /// 字符串转Lambda表达式
        /// 
        /// 
        /// 
        /// 
        /// 
        public static object StringToLambda(string exp, T t)
        {
            Interpreter interpreter = new Interpreter();
            Dictionary dict = new Dictionary();
            foreach (PropertyInfo item in t.GetType().GetProperties())
            {
                interpreter.SetVariable(item.Name, item.GetValue(t, BindingFlags.GetProperty, null, null, null));
            }
            return interpreter.Eval(exp);
        }
    }

4、数据库中设置动态公式

公式如下:

OverFloor < 1 ? 60 : (OverFloor >= 7 && OverFloor <= 11 ? 80 : (OverFloor > 11 ? 100 : 0))

5、调用公共方法,对动态公式字符串进行转换,并直接计算返回结果

调用方法如下:

var calVal = LambdaParsers.StringToLambda(item.Criterion, item);

返回结果如下:


Linq 实现字符串转Lambda表达式(公式动态求值)

实体结果

Linq 实现字符串转Lambda表达式(公式动态求值)

计算公式结果

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章