iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#怎么动态创建lambda表达式
  • 643
分享到

C#怎么动态创建lambda表达式

2023-07-05 06:07:24 643人浏览 安东尼
摘要

这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!C#动态创建lambda表达式代码如下: 

这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!

C#动态创建lambda表达式

代码如下:

           //querydata 是Dictionary<string,string> 放着要查询的属性名和相应的值            ParameterExpression pe = Expression.Parameter(typeof(Customer), "customer");//lambda表示式里的参数我这边是单参数            Expression left;//相当于 a=b 的 a            Expression right;//相当于a=b 的 b            Expression e;//作为最后形成的表达式的载体            //先放一个初始值后面被替换不然循环里不方便用                       left = Expression.Property(pe, typeof(Customer).GetProperty("name"));//Customer.name            right = Expression.Constant("巅峰白杨");//Constant方法设置属性对应的值            e = Expression.Equal(left, right);//Customer.name=="巅峰白杨"            //循环查询条件字典             foreach (var item in querydata)            {                if (!item.Value.ToString().Trim().Equals(""))                {                    left = Expression.Property(pe, typeof(SFC_Package).GetProperty(item.Key));                    right = Expression.Constant(item.Value);                    if (index == 0)                    {                        e = Expression.Equal(left, right);                        index++;                    }                    else                    {                        if (e != null)                        {                            Expression tempe;                            tempe = Expression.Equal(left, right);                            e = Expression.And(tempe, e);//加了一个&&连接两个判断                        }                    }                }            }                        IQueryable<Customer> queryableData = db.Customer.AsQueryable<Customer>();//将IEnumerable类型转成IQueryable                       //Where方法的lambda表达式            MethodCallExpression whereCallExpression = Expression.Call(            typeof(Queryable),            "Where",            new Type[] { queryableData.ElementType },            queryableData.Expression,            Expression.Lambda<Func<SFC_Package, bool>>(e, new ParameterExpression[] { pe }));            //OrderBy方法的lambda表达式 这边写的有点冗余第一次写不太习惯,想想重复了很多            var propertyinfo=typeof(Customer).GetProperty("Name");            Expression body=Expression.Property(pe,propertyinfo);            Type nametype=propertyinfo.PropertyType;            MethodCallExpression orderByCallExpression = Expression.Call(             typeof(Queryable),            "OrderBy",            new Type[] { queryableData.ElementType, nametype},//其实可以写成queryableData.ElementType.GetProperty("Name").PropertyType                        whereCallExpression,            Expression.Lambda(body, pe));            //使用已创建好的lambda表达式查询数据 ps:IQueryable和IEnumerable可以转换方便处理查询结果             IQueryable<SFC_Package> results = queryableData.Provider.CreateQuery<Customer>(orderByCallExpression);

网上还看到一种简单的多条件查询的方法,相当于

var data=db.Customer.Where(o=>o.name=="西门吹雪");data=data.Where(o=>o.sex="男神")

用循环来多次Where实现多条件查询,感觉可能会造成多次数据库查询,不过用在Linq to Object

上应该挺好的。

最后学习的动态创建lambda表达式地址 点击打开链接

Lambda表达式动态拼接生成工具

    public static class LambdaUtil<T>    {        /// <summary>        /// lambda表达式:t=>true        /// </summary>        /// <returns></returns>        public static Expression<Func<T, bool>> True()        {            return t => true;        }         /// <summary>        /// lambda表达式:t=>false        /// </summary>        /// <returns></returns>        public static Expression<Func<T, bool>> False()        {            return t => false;        }         /// <summary>        /// lambda表达式:t=>t.propName        /// 多用于order排序        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <typeparam name="TKEy">返回类型</typeparam>        /// <param name="propName">属性名</param>        /// <returns></returns>        private static Expression<Func<T, TKey>> Order<TKey>(string propName)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个属性            MemberExpression property = Expression.Property(parameter, propName);            // 生成lambda表达式            return Expression.Lambda<Func<T, TKey>>(property, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName==propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> Equal(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个相等比较Expression            BinaryExpression binary = Expression.Equal(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName!=propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> NotEqual(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个不相等比较Expression            BinaryExpression binary = Expression.NotEqual(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName&lt;propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> LessThan(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个不相等比较Expression            BinaryExpression binary = Expression.LessThan(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName&lt;=propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个不相等比较Expression            BinaryExpression binary = Expression.LessThanOrEqual(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName>propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个不相等比较Expression            BinaryExpression binary = Expression.GreaterThan(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName>=propValue        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue);            // 创建一个不相等比较Expression            BinaryExpression binary = Expression.GreaterThanOrEqual(member, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, parameter);        }         /// <summary>        /// lambda表达式:t=>{t.contains(propvalue1) ||...||t.contains(propvalueN)}        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValues">属性值数组</param>        /// <returns></returns>        public static Expression<Func<T, bool>> In(string propName, string[] propValues)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t"); // left            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            Expression constant = Expression.Constant(false);            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });            foreach (string item in propValues)            {                // 创建一个带参数方法Expression                MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right                // 连接参数方法                constant = Expression.Or(methodCall, constant);            }             // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(constant, new ParameterExpression[] { parameter });        }         /// <summary>        /// lambda表达式:t=>{!(t.contains(propvalue1) ||...||t.contains(propvalueN))}        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValues">属性值数组</param>        /// <returns></returns>        public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            Expression constant = Expression.Constant(false);            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });            foreach (string item in propValues)            {                // 创建一个带参数方法Expression                MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right                // 连接参数方法                constant = Expression.Or(methodCall, constant);            }             // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(Expression.Not(constant), new ParameterExpression[] { parameter });        }         /// <summary>        /// lambda表达式:t=>t.propName.Contains(propValue)        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> Contains(string propName, string propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue, typeof(string));            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });            // 创建一个带参数方法Expression            MethodCallExpression methodCall = Expression.Call(member, method, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(methodCall, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName.Contains(propValue)        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> StartWith(string propName, string propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue, typeof(string));            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });            // 创建一个带参数方法Expression            MethodCallExpression methodCall = Expression.Call(member, method, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(methodCall, parameter);        }         /// <summary>        /// lambda表达式:t=>t.propName.Contains(propValue)        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> EndsWith(string propName, string propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue, typeof(string));            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });            // 创建一个带参数方法Expression            MethodCallExpression methodCall = Expression.Call(member, method, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(methodCall, parameter);        }         /// <summary>        /// lambda表达式:!(t=>t.propName.Contains(propValue))        /// 多用于where条件        /// </summary>        /// <typeparam name="T">参数类型</typeparam>        /// <param name="propName">属性名称</param>        /// <param name="propValue">属性值</param>        /// <returns></returns>        public static Expression<Func<T, bool>> NotContains(string propName, string propValue)        {            // 创建节点参数t            ParameterExpression parameter = Expression.Parameter(typeof(T), "t");            // 创建一个成员(字段/属性)            MemberExpression member = Expression.PropertyOrField(parameter, propName);            // 创建一个常数            ConstantExpression constant = Expression.Constant(propValue, typeof(string));            // 创建一个方法            MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });            // 创建一个带参数方法Expression            MethodCallExpression methodCall = Expression.Call(member, method, constant);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(Expression.Not(methodCall), parameter);        }         /// <summary>        /// lambda表达式:t=>{left and right}        /// 多用于where条件        /// </summary>        /// <param name="left">左侧条件</param>        /// <param name="right">右侧条件</param>        /// <returns></returns>        public static Expression<Func<T, bool>> And(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)        {            // 创建参数表达式            InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());            // 创建and运算            BinaryExpression binary = Expression.And(left.Body, invocation);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);        }         /// <summary>        /// lambda表达式:t=>{left or right}        /// 多用于where条件        /// </summary>        /// <param name="left">左侧条件</param>        /// <param name="right">右侧条件</param>        /// <returns></returns>        public static Expression<Func<T, bool>> Or(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)        {            // 创建参数表达式            InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());            // 创建or运算            BinaryExpression binary = Expression.Or(left.Body, invocation);            // 生成lambda表达式            return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);        }    }

感谢各位的阅读,以上就是“C#怎么动态创建lambda表达式”的内容了,经过本文的学习后,相信大家对C#怎么动态创建lambda表达式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C#怎么动态创建lambda表达式

本文链接: https://www.lsjlt.com/news/350066.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#怎么动态创建lambda表达式
    这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!C#动态创建lambda表达式代码如下: ...
    99+
    2023-07-05
  • C#如何动态创建lambda表达式
    目录C#动态创建lambda表达式Lambda表达式动态拼接生成工具类总结C#动态创建lambda表达式 近日在使用了一下EF框架,在做多条件where查询的时候不知道怎么...
    99+
    2023-02-26
    C# lambda表达式 创建lambda表达式 C#表达式
  • 怎么用C#表达式树Expression动态创建表达式
    本篇内容介绍了“怎么用C#表达式树Expression动态创建表达式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一些管理后台中,对数据进...
    99+
    2023-06-22
  • C#表达式树Expression动态创建表达式
    目录创建 QueryEntity 类创建 OperatorEnum 类创建 ExpressionExtension 类使用示例单条件查询多条件查询多表查询上一篇中说到了 Expres...
    99+
    2024-04-02
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • C# Lambda表达式怎么用
    这篇文章主要为大家展示了“C# Lambda表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C# Lambda表达式怎么用”这篇文章吧。C#语言还是比较常见的东西,这里我们主要介绍C#...
    99+
    2023-06-17
  • C#表达式树Expression怎么创建
    本篇内容介绍了“C#表达式树Expression怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是表达式树表达式树以树形数据结构表...
    99+
    2023-06-22
  • C++Lambda表达式详解
    目录概述语法分析捕获列表关键字声明示例捕获列表按值传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下: ...
    99+
    2024-04-02
  • C# Lambda表达式树怎么实现
    这篇文章主要介绍“C# Lambda表达式树怎么实现”,在日常操作中,相信很多人在C# Lambda表达式树怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# Lambda表达式树怎么实现”的疑惑有所...
    99+
    2023-06-17
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2024-04-02
  • C++11的lambda表达式怎么使用
    这篇文章主要讲解了“C++11的lambda表达式怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11的lambda表达式怎么使用”吧!可变lambda假设有如下vector,保...
    99+
    2023-06-19
  • C#中的Lambda表达式怎么优化
    本篇内容介绍了“C#中的Lambda表达式怎么优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用Lambda表达式将会造成Lambda表...
    99+
    2023-06-17
  • C++11中的lambda表达式怎么使用
    本篇内容介绍了“C++11中的lambda表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!可调用对象对于一个表达式e,如果可以编...
    99+
    2023-06-19
  • C++lambda表达式使用介绍
    目录前言lambda表达式格式一些语法走进底层前言 C++98中的一个例子。 #include <iostream> #include <vector> #i...
    99+
    2024-04-02
  • C#3.0中Lambda表达式详解
    在C#2.0中,微软给我们带来了一些新的特性,例如泛型,匿名委托等。然而,这些新的特性多多少少会给人一种从别的语言中“抄”来的感觉(例如泛型类似C++的模板,一些特性类似Java中的...
    99+
    2022-11-15
    C# Lambda
  • C#中Lambda表达式的用法
    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关。当...
    99+
    2024-04-02
  • Java中Lambda表达式怎么用
    这篇文章主要介绍了Java中Lambda表达式怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言Lambda表达式是java 8中包含的重要功能之一。Lambda表...
    99+
    2023-06-15
  • Linq Lambda表达式怎么使用
    本篇内容介绍了“Linq Lambda表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#3.0时代的Linq查询语句在C#3....
    99+
    2023-06-17
  • Java Lambda表达式怎么应用
    Java 中的 Lambda 表达式是 JDK 8 中引入的一种函数式编程的特性,它可以使代码更简洁、更易读、更易维护。Lambda...
    99+
    2023-10-10
    java
  • JavaScript正则表达式怎么创建
    本篇内容介绍了“JavaScript正则表达式怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.JavaScript正则表达式的作用...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作