泛型方法动态生成表达式树 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 = });
}
这是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(), Expression.Constant()); /// <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(), Expression.Constant());
} /// <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 = ; 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 = });
}
期待更好的方法。
泛型方法动态生成表达式树 Expression的更多相关文章
- 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。
CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...
- ahjesus动态生成表达式树
直接上方法,看的懂的拿去用,看不懂的找资料看懂 , , Double floorprice = , Double topprice = , string brandstr = "" ...
- 表达式树 Expression
转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> ...
- c# 表达式目录树拷贝对象(根据对象类型动态生成表达式目录树)
表达式目录树,在C#中用Expression标识,这里就不介绍表达式目录树是什么了,有兴趣可以自行百度搜索,网上资料还是很多的. 这里主要分享的是如何动态构建表达式目录树. 构建表达式目录树的代码挺简 ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...
- C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式
C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...
- C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式
C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...
随机推荐
- USB OTG简要
1 介绍 随着USB2.0发布版本号,USB更受欢迎.它已成为一种标准接口.现在,USB它支持三种速度:低速(1.5Mb/s).全速(12Mb/s)速(480Mb/s),四种传输类型:块传输.同步传输 ...
- 发展,需求驱动 · 一间 所见即所得
从需求不是一句空话.同样是在发展过程中真正的. 需求驱动,与极限编程的一些想法和测试驱动开发基本重合. 鉴于该网站的发展是一个比较流行的方向,我会从网站开始,阐述自己的"需求驱动的发展&qu ...
- hdu 2454 Degree Sequence of Graph G (推断简单图)
///已知各点的度,推断是否为一个简单图 #include<stdio.h> #include<algorithm> #include<string.h> usin ...
- HDFS 上传文件的不平衡,Balancer问题是过慢
至HDFS上传文件.假定从datanode开始上传文件,上传的数据将导致目前的当务之急是全datanode圆盘.这是一个分布式程序的执行是非常不利. 解决方案: 1.从其他非datanode节点上传 ...
- Objective-C辛格尔顿
单例类是一种特殊的类.在一个进程种仅仅会存在一个该类的对象,在iOS应用中仅仅会出现一个对象.这样的设计模式在系统框架中很多地方都使用了.如NSFileManager.UIApplication等. ...
- GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理(转)
如何获取图片对应的base64字符串呢? 1:使用代码获取: 运行下面代码 var reader = new FileReader(), htmlImage; reader.onload = func ...
- Attribute(两)——定义自己的特色+Asp.net MVC中间filter详细解释
部分博客是预先定义的有关特性的一些基本特征,同时还Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自己定义特性服务的AttributeUsage,这篇博客主要是通过filter ...
- HDU 4309 Seikimatsu Occult Tonneru 网络流量+像缩进
主题链接:点击打开链接 意甲冠军: 题意:给出一张N(N<=100)个点,M(M<=1000条)边的有向图. 每一个点上都有一些人.每条边有4个属性(u,v,w,p). 这些边分为三种:( ...
- C#基础之二
C#基础之二 1. 静态字段.静态成员:由该类的所有实例共享,其变化,实例是对所有可见. 2. 声明为static有:场.方法.属性.构造函数.运营商.事件. 3. 不同的常量静态量:位置,在编 ...
- HDU 1950 Bridging signals (DP)
职务地址:HDU 1950 这题是求最长上升序列,可是普通的最长上升序列求法时间复杂度是O(n*n).显然会超时.于是便学了一种O(n*logn)的方法.也非常好理解. 感觉还用到了一点贪心的思想. ...