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

        public string GetGridJSON(TraderInfo model)
        {
            IQueryable<TraderInfo> Temp = db.TraderInfo;
            if (model.LoginAccount != null)
            {
                Temp = Temp.Where(X => X.LoginAccount == model.LoginAccount);
            }
            if (model.ShopName != null)
            {
                Temp = Temp.Where(X => X.ShopName == model.ShopName);
            }
            return JsonConvert.SerializeObject(Temp.ToList(), Formatting.Indented, new JsonSerializerSettings() { DateFormatHandling = 0 });
        }

这是MVC 项目。  点击查询 执行 GetGridJSON 方法。由于 MVC 规范  name属性可以匹配 模型,如果 不填写 账号 、名称 ,返回的  model 里面 的 账号 、名称属性为 null。 每次都要判断 是否 是 null ,如果是 ,就 查询 所有,否  才能匹配where。

这很不好,如果我的条件 很多 呢?  这样的判断  就 很烦了。

我做了如下如下封装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Linq.Expressions;

namespace EF_DAL
{
    /// <summary>
    /// 动态生成 表达式树
    /// </summary>
    public class Custom_Expression
    {
        public delegate Expression delegate_Expression(Expression left, Expression right);
        private static BinaryExpression filter_Temp = Expression.Equal(Expression.Constant(1), Expression.Constant(1));

        /// <summary>
        /// 自定义Equal方法(允许value为null),value为null 的时候,该查询条件 不会生成
        /// </summary>
        /// <typeparam name="T">实体数据类型</typeparam>
        /// <param name="StrArrPropertyName">以逗号分割的列名称</param>
        /// <param name="values">这些列对应的值</param>
        /// <returns>返回Lambda表达式,eg:where(Lambda)</returns>
        public Expression<Func<T, bool>> Custom_Equal<T>(string StrArrPropertyName, params object[] values)
        {
            return Custom_Expression_Function<T>(Equal_result, StrArrPropertyName, values);
        }

        private void Init()
        {
            filter_Temp = Expression.Equal(Expression.Constant(1), Expression.Constant(1));
        }

        public Expression<Func<T, bool>> Custom_Contain<T>(string StrArrPropertyName, params object[] values)
        {
            return Custom_Expression_Function<T>(Call_result, StrArrPropertyName, values);
        }

        private Expression Call_result(Expression left, Expression right)
        {
            return Expression.Call(left, typeof(string).GetMethod("Contains"), right);
        }

        private Expression Equal_result(Expression left, Expression right)
        {
            return Expression.Equal(left, right);
        }

        private Expression<Func<T, bool>> Custom_Expression_Function<T>(delegate_Expression del, string StrArrPropertyName, params object[] values)
        {
            Init();
            var PropertyName_arr = StrArrPropertyName.Split(‘,‘);
            var param = Expression.Parameter(typeof(T));
            for (int i = 0; i < PropertyName_arr.Length; i++)
            {
                if (values[i] == null) continue;
                string propertyName = PropertyName_arr[i].ToString();
                var value = values[i];
                Expression left = Expression.Property(param, typeof(T).GetProperty(propertyName));
                Expression right = Expression.Constant(value, value.GetType());
                Expression result = del(left, right);
                filter_Temp = Expression.And(filter_Temp, result);
            }
            return Expression.Lambda<Func<T, bool>>(filter_Temp, param);
        }
    }
}

直接这样 调用啦!

 public string GetGridJSON(TraderInfo model)
        {
            EF_DAL.Custom_Expression CE = new EF_DAL.Custom_Expression();
            var rrr = db.TraderInfo.Where(CE.Custom_Equal<TraderInfo>("LoginAccount,ShopName", model.LoginAccount, model.ShopName)).ToList();
            return JsonConvert.SerializeObject(rrr, Formatting.Indented, new JsonSerializerSettings() { DateFormatHandling = 0 });
        }

期待更好的方法。

时间: 2024-08-09 21:30:17

泛型方法动态生成表达式树 Expression的相关文章

表达式树 Expression

转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if (model.LoginAccount != null) { Temp = Temp.Where(X => X.LoginAccount == model.LoginAccount); } if (model.ShopName != null) { T

[C#] 说说表达式树 - Expression Trees

说说表达式树 - Expression Trees 序 简单说下表达式树. 目录 介绍 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等. 你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库中执行 LINQ 查询以及创建动态查询. 表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET Framework 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言

[C#] C# 知识回顾 - 表达式树 Expression Trees

C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达式树 调试 简介 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等. 你可以对表达式树中的代码进行编辑和运算.这样能够动态修改可执行代码.在不同数据库中执行 LINQ 查询以及创建动态查询. 表达式树还能用于动态语言运行时 (DLR) 以提供

Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制

Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制 仓储大叔好了相赠 网上2500元 跟谁学课堂 C#视频 ddd领域驱动架构设计视频 还赠送ABP视频两套 qq 2589406800 qq1399494644 qq2128543647 qq2890083872 qq3235634116 qq3381945576 qq2171713479源代码框架lind.ddd(后台管理系统,电商系统,API,SSO,xamarin,ko,各组件单元测试) 赠送

LinqToDB 源码分析——生成表达式树

当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开IQueryProvider接口.LinqToDB框架跟这俩个接口有关系的有三个类:Table<T>类.ExpressionQuery<T>类.ExpressionQueryImpl<T>类.其中最重要的是ExpressionQuery<T>类.他是Table&l

C# 表达式树 Expression

表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构. 几种常见的表达式 BinaryExpression 包含二元运算符的表达式 1 BinaryExpression binaryExpression = Expression.MakeBinary(ExpressionType.Add,Expression.Constant(1),Expression.Constant(2)); 2 Console.WriteLine(binaryExpression.ToSt

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是时候来引用他解决问题.而本节主要目的就是使用表达式树解决实际问题. 读前必备: 本节学习前,需要掌握以下知识: A.继承 [.net 面向对象编程基础]  (12) 面向对象三大特性——继承 B.多态 [.net 面向对象编程基础]  (13) 面向对象三大特性——多态 C.抽象类 [.net 面向

SqlDataReader生成动态Lambda表达式

上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对SqlServer返回的流对象 SqlDataReader 进行处理,也采用动态生成Lambda表达式的方式转换实体. 先上一版代码 1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using Syst

C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解

笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func<> 基础. 表达式树 形状可以参考 二叉树. 可以把表达式树理解成 数学表达式. 数学表达式的所有常量.符号为表达式树的底节点.每一次计算生成的结果是一个结点,或者说他们的共同结点就是他们应该进行的运算. 生成表达式树 表达式树的创建有 Lambda表达式法 和 组装法 为了方便,这里指定生成的表