以前一直想着有没有一个方法能够把字符串直接转化成函数的,刚好有需求就找了下,还真有。

微软地址:https://docs.microsoft.com/en-us/previous-versions/bb894665(v=msdn.10)?redirectedfrom=MSDN

一、安装

NuGet程序管理器,System.Linq.Dynamic

二、应用与性能:

class Model
{
public string name;
public Model(string s)
{
name = s;
}
}
//创建示例数据:
Model m1 = new Model("");
Model m2 = new Model("");
List<Model> list = new List<Model>();
list.Add(m1);
list.Add(m2); //普通Lambda
list.Where(m=>m.name.StartsWith("")).ToList(); //DynamicQuery
list.AsQueryable().Where("name.StartsWith(@0) ", "").ToList();
效果一样,但性能开销不同,各执行1000次循环:

尝试其他方法,ParseLambda ,把条件单独出来获得函数委托,再调用Linq的Where。
var lambda = DynamicExpression.ParseLambda<Model, bool>("name.StartsWith(@0)", "");
var fun = expfun.Compile();
list.Where(s => fun(s)).ToList();

运行1000次看下,虽然和原生的还有差距,但已经在可以接受的范围内了。

 三、其他方法:

//DynamicExpression中还有CreateClass可以实现类的动态创建:
var tp = DynamicExpression.CreateClass(new DynamicProperty("a", typeof(decimal)), new DynamicProperty("b", typeof(decimal)));
var obj = Activator.CreateInstance(tp);
tp.GetProperty("a").SetValue(obj, 12m,null);
tp.GetProperty("b").SetValue(obj, 10m, null);
//此时一个包含a,b属性的实例obj已经创建好,这时利用ParseLambda<T,S>就可以做到很多事情,比如根据字符串进行运算。
var lambda = DynamicExpression.ParseLambda(tp,typeof(decimal),"a*b+2");
var fun = lambda.Compile();
decimal sum = (decimal)fun.DynamicInvoke(obj);
//其他的比如根据已知类型也可进行一些想要的操作:
DynamicExpression.ParseLambda<Model, string>("@0 + name", "名字:");

有时string转成函数执行还是很方便的,用这个做一个计算器小程序的话,运算符解析什么的就完全不需要考虑了。

参考链接:

https://www.cnblogs.com/David-Qian/archive/2009/01/22/1379596.html

https://blog.csdn.net/xuchen_wang/article/details/90749743

System.Linq.Dynamic字符串转委托的更多相关文章

  1. 【转】借助System.Linq.Dynamic, IQueryable根据排序字符串排序

    在使用Entity Framework时,若有多个排序,需要OrderBy (OrderByDescending)再ThenBy (ThenByDescending) 假设需要根据Name升序排序,再 ...

  2. 借助System.Linq.Dynamic, IQueryable根据排序字符串排序

    在使用Entity Framework时,若有多个排序,需要OrderBy (OrderByDescending)再ThenBy (ThenByDescending) 假设需要根据Name升序排序,再 ...

  3. System.Linq.Dynamic 动态查询

    安装 VS->工具栏->NuGet程序管理器,System.Linq.Dynamic 注意: 使用动态查询必须先调用AsQueryable()方法,因为动态扩展仅适用于实现IQueryab ...

  4. System.Linq.Dynamic的使用

    项目中经常用到组合条件查询,根据用户配置的查询条件进行搜索,拼接SQL容易造成SQL注入,普通的LINQ可以用表达式树来完成,但也比较麻烦.有个System.Linq.Dynamic用起来比较方便. ...

  5. System.Linq.Dynamic 和Nhibernate

    var session = NHibernateSessionManager.Instance.GetSession(); "); var staffList = session.Query ...

  6. System.Linq.Dynamic

    http://dynamiclinq.codeplex.com/ 10万回 用动态表达式 0.19s ,普通Lamba 0.02s,效率还可以 /* User: Peter Date: 2016/4/ ...

  7. EF Core中关于System.Linq.Dynamic.Core的使用(转载)

    项目中经常用到组合条件查询,根据用户配置的查询条件进行搜索,拼接SQL容易造成SQL注入,普通的LINQ可以用表达式树来完成,但也比较麻烦.有个System.Linq.Dynamic.Core用起来比 ...

  8. linq使用字符串参数排序

    今天找了半天资料,有两种种方法: 1.把字符串参数变为lambda表达式 2.使用System.Linq.dynamic引用 这里我讲第二种方法 第一步:nuget搜索关键字"dynamic ...

  9. LINQ查询字符串判断是否大写

    #region Linq to 字符串char.IsUpper意思是判断是否大写            //string strDemo = "HelloWord!";       ...

随机推荐

  1. Markdown 语法自用

    Markdown 语法自用 1. 标题 用#来标记 hi hihi hihihi hihihiih hihihihihi hihihihihihi 2. 段落格式 2.1 字体 ​ 斜体:文字两端加上 ...

  2. 第十一节:configParse模块

    作用:配置文件解析模块,用来增删改查配置文件内容,不区分大小写 配置文件案例: tets.ini [模块] key=value import configparser config = configp ...

  3. react性能优化最佳实践

    1.PureComponent 的使用场景 PureComponent 和 Component 的区别是,PureComponent 自带 shouldComponentUpdate 生命周期函数,会 ...

  4. 全网最全最细的jmeter接口测试教程以及接口测试流程详解

    一.Jmeter简介 ​ Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试. Jmeter具备高移植性,可以实现跨平台运行. Jmeter可以实 ...

  5. [javascript] js实现小数的算术运算方法

    /** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:accAdd(arg ...

  6. python第三方库安装与卸载

    一.检查python环境是否正常 python安装完毕并设置环境变量后,可在cmd中运行python查看,显示版本等信息  二.查看已经安装的第三方库 通过pip list可查看已安装的库,以及对应的 ...

  7. 解决报错:JPA-style positional param was not an integral ordinal;

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...

  8. JWT验证机制【刘新宇】【Django REST framework中使用JWT】

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...

  9. 基于layui,Jquery 表格动态编辑 设置 编辑值为 int 或者 double 类型及默认值

    首先先推荐大家在看这篇笔记时,阅读过我写的这篇 Layui表格编辑[不依赖Layui的动态table加载] 阅读过上面那篇笔记之后呢,才能更好的理解我现在所要说的这个东西 接下来废话不多说,上代码. ...

  10. GoJS事件

    1.阻止键盘事件 myDiagram.commandHandler.doKeyDown = function () { var e = myDiagram.lastInput; // Meta(Com ...