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

表达式树 Expression的更多相关文章

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

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  2. 表达式树(Expression Tree)

    饮水思源 本文并非原创而是下面网址的一个学习笔记 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/e ...

  3. C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

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

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  5. jQuery find() 搜索所有段落中的后代 C# find() 第一个匹配元素 Func 有返回值 Action是没有返回值 Predicate 只有一个参数且返回值为bool 表达式树Expression

    所有p后代span Id为 TotalProject 的 select 标签 的后代 option标签 为选中的 text using System; using System.Collections ...

  6. 利用表达式树Expression优化反射性能

    最近做了一个.Net Core环境下,基于NPOI的Excel导入导出以及Word操作的服务封装,涉及到大量反射操作,在性能优化过程中使用到了表达式树,记录一下. Excel导入是相对比较麻烦的一块, ...

  7. 表达式树Expression

    Expression表达式树动态查询 在进行数据列表的查询中,我们通常会使用两种方式进行查询: linq查询 数据库sql语句查询 这样固然可以实现查询,本人之前也都是这么做的,因为查询的条件很少.使 ...

  8. C# 表达式树 Expression

    表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构. 几种常见的表达式 BinaryExpression 包含二元运算符的表达式 BinaryExpression b ...

  9. Func委托与表达式树Expression

    最近在写ORM框架,其中遇到一个难点,就是作为框架调用方如何将查询条件传入框架内.其中就用到了Expression. Func委托 要Expression先要了解Func委托,Func委托的样式是: ...

随机推荐

  1. android得知----overridePendingTransition

    1 Activity动画是指从一个切换activity跳到另一个activity随着电影. 它由两部分组成:第一部分是一个activity动画出口:中的第二个另一部分activity动画被访问: 于A ...

  2. iOS 7 新特性

      iOS7更新了很多引人注目的功能.用户界面完全重新设计了.iOS7为开发2D,2.5D游戏引入了全新的动画系统.加强多线程,点对点连接,以及许多其他重要的功能让iOS7成为有史以来最有意义的一次发 ...

  3. sql 添加用户

    use master GO EXEC sp_addlogin 'infos1', '1', 'master' exec sp_grantdbaccess 'infos311' -- 给访问权限 USE ...

  4. SQL_substr功能测试

    原创作品.从 "深蓝blog" 博客,欢迎转载,请务必注明转载的来源.权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/articl ...

  5. 流动python - 自然装饰

    好多人搞非常复杂的装饰,其实本质easy. 首先,这是什么装饰?发现穿着在代码@xxx帽子,它是装饰. 它是由如何定制它装饰? 其实不管什么人需要一个参数callable用来做装饰器,比方函数和类.为 ...

  6. Swift伟大的编程语言数据采集

    Swift 2048 https://github.com/austinzheng/swift-2048 苹果官方Swift文档<The Swift Programming Language&g ...

  7. 《TCP/IP作品详细解释2:达到》注意事项--IP地址

    1.接口和地址 如下面的图全部本文中讨论的接口和地址的结构看一个示例配置: 上图中显示了我们三个接口样例:以太网接口,SLIP接口和环回接口. 它们都有一个链路层地址作为地址列表中的第一个结点. 显示 ...

  8. Java中finally你知多少

    首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题, ...

  9. div+js 弹出层

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  10. android:GLSurfaceView绘制bitmap图片及glViewport调整的效果

    首先看一下GLSurfaceView是怎样绘制的.正如android开发文档中描写叙述的那样,我们须要new一个GLSurfaceView对象,然后设置一个实现了Renderer接口的对象,我们须要写 ...