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的更多相关文章

  1. 表达式树扩展 动态生成表达式树插件 Sy.ExpressionBuilder。

    CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一 ...

  2. ahjesus动态生成表达式树

    直接上方法,看的懂的拿去用,看不懂的找资料看懂 , , Double floorprice = , Double topprice = , string brandstr = "" ...

  3. 表达式树 Expression

    转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> ...

  4. c# 表达式目录树拷贝对象(根据对象类型动态生成表达式目录树)

    表达式目录树,在C#中用Expression标识,这里就不介绍表达式目录树是什么了,有兴趣可以自行百度搜索,网上资料还是很多的. 这里主要分享的是如何动态构建表达式目录树. 构建表达式目录树的代码挺简 ...

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

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

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

    回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...

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

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

  8. C# 动态构建表达式树(二)——构建 Select 和 GroupBy 的表达式

    C# 动态构建表达式树(二)--构建 Select 和 GroupBy 的表达式 前言 在上篇中写了表达式的基本使用,为 Where 方法动态构建了表达式.在这篇中会写如何为 Select 和 Gro ...

  9. C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式

    C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...

随机推荐

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  2. shell 脚本运算符

    1.数值 格式: test "num1" opr "num2" [ "num1" opr "num2" ] opr 取值 ...

  3. Web APi之认证

    Web APi之认证(Authentication)两种实现方式后续[三](十五)   前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不 ...

  4. 【夯实基础】javakeywordsynchronized 详细说明

    尊重版权:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的keyword.当它用来修饰一个方法或者一个代码 ...

  5. .NET MVC学习笔记(一)

    看了些关于MVC的资料,做一些MVC的笔记. 分解关注点 在MVC世界里有个很重要的观念--"分解关注点"(Separation of Concerns),指的是:当你进行软件开发 ...

  6. Linux查看命令终止进程

    Linux查看命令终止进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps PID TTY TIME CMD 2576 pts/0 00:00:00 ba ...

  7. 按某个字段来分组、编号的row_number()函数

    本文参考 http://zhidao.baidu.com/link?url=8su4F16Et8Q0S3FmybwniJSI51Ms0AeVujcEXhyEaZh3u5LlOng5Xri_9zHsl7 ...

  8. hibernate Disabling contextual LOB creation as connection was null

    使用hibernate通路sybase当遇到异常. Could not obtain connection metadata : ASE is now using a multi-byte c ...

  9. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  10. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...