表达式树 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)
            {
                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
{
/// <summary>
///
/// </summary>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns>Lambda表达式树</returns>
public delegate Expression ExpressionEventHandler(Expression left, Expression right);
private static BinaryExpression filter = Expression.Equal(Expression.Constant(1), Expression.Constant(1));

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

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

private Expression Contains_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);
}

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Handler">可以是 Equal、Contains</param>
/// <param name="columnNames"></param>
/// <param name="values"></param>
/// <returns></returns>
private Expression<Func<T, bool>> Custom_Expression_Common<T>(ExpressionEventHandler handler, string columnNames, params object[] values)
{
Init();
var columns = columnNames.Split(‘,‘);
var param = Expression.Parameter(typeof(T));
for (int i = 0; i < columns.Length; i++)
{
if (values[i] == null) continue;
string columnName = columns[i].ToString();
var value = values[i];
Expression left = Expression.Property(param, typeof(T).GetProperty(columnName));
Expression right = Expression.Constant(value, value.GetType());
Expression result = handler(left, right);
filter = Expression.And(filter, result);// where 条件 拼接
}
return Expression.Lambda<Func<T, bool>>(filter, param);
}
}
}

直接这样 调用啦!

 

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

时间: 2024-10-21 21:31:57

表达式树 Expression的相关文章

[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) 以提供

泛型方法动态生成表达式树 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

C# 表达式树 Expression

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

Expression表达式树

表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z; 2.编译表达式树,该方法将表达式树表示的代码编译成一个可执行委托 expr.Compile()(1, 2, 3) 3.IQueryable<T>的扩展方法,Whe

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

什么是表达式树,它与表达式、委托有什么区别?

序言 首先,需要普及下基础知识: Expression我们称之为:表达式树, 而Func<>或者Action 称之为:匿名委托,Func与Action的区别是Func带返回值(至少一个参数),Action不带返回值(可以没有任何参数). 以上的关键词是在.net 3.5之后出现的,配合Linq中Lambda使用. 当然Expression还可以动态的进行构造它,而不使用Lambda表达式来定义. 什么是表达式树 它是一种数据结构体,用于存储需要计算.运算的一种结构.这种结构可以只是”存储“,而

Lambda表达式和Lambda表达式树

LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambda表达式不仅可以用他们创建委托实例,而且C#编译器也能将他们转换成表达式树——用于表示Lambda表达式逻辑的一种数据结构.简言之——Lambda表达式用符号语言习惯的方法来表示LINQ数据管线中的操作. 作为委托的Lambda表达式 Lambda有特殊转换规则:表达式的类型本身并非委托类型,但它可