通过Expression类进行动态构造lamda表达式。

实现了以下几种类型,好了代码说话:

public Expression<Func<T, bool>> GetAndLambdaExpression<T>(string[] keys,object[] values,string[] methons)
{

Expression expression_return = Expression.Constant(true);
Type TType = typeof(T);
ParameterExpression expression_param = Expression.Parameter(TType, "p");
Expression temp;
for (int i = 0; i < keys.Length; i++)
{
    switch (methons[i])
    {
        case "=":
            temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                TType.GetMethod("ToString")),
             Expression.Constant(values[i]));
            expression_return = Expression.And(expression_return, temp);
            break;
        case "%":
            temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                typeof(string).GetMethod("Contains"),
                Expression.Constant(values[i], typeof(string)));
            expression_return = Expression.And(expression_return, temp);
            break;
        case ">":
            //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
            //    TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThan"), Expression.Constant(values[i]));
            temp = Expression.GreaterThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
            expression_return = Expression.And(expression_return, temp);
            break;
        case "<":
            //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
            //   Expression.GetType().GetMethod("LessThan"), Expression.Constant(values[i]));
            temp=Expression.LessThan(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
            expression_return = Expression.And(expression_return, temp);
            break;
        case ">=":
            //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
            //    TType.GetProperty(keys[i]).GetType().GetMethod("GreaterThanOrEqual"), Expression.Constant(values[i]));
            temp = Expression.GreaterThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
            expression_return = Expression.And(expression_return, temp);
            break;
        case "<=":
            //temp = Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
            //    TType.GetProperty(keys[i]).GetType().GetMethod("LessThanOrEqual"), Expression.Constant(values[i]));
            temp = Expression.LessThanOrEqual(Expression.Property(expression_param, TType.GetProperty(keys[i])), Expression.Constant(Convert.ToInt32(values[i])));
            expression_return = Expression.And(expression_return, temp);
            break;
        case "in":
            string[] strarr = values[i].ToString().Split(',');
            Expression or_return = Expression.Constant(false);
            for (int k = 0; k < strarr.Length; k++)
            {
                temp = Expression.Equal(Expression.Call(Expression.Property(expression_param, TType.GetProperty(keys[i])),
                    TType.GetMethod("ToString")),
                 Expression.Constant(strarr[k]));
                or_return = Expression.Or(or_return, temp);
            }             expression_return = Expression.And(expression_return, or_return);
            break;
    }
} return (Expression<Func<T, bool>>)Expression.Lambda<Func<T, bool>>(expression_return, new ParameterExpression[] { expression_param });

}

       IList<People> peopleList = new List<People>();
            for (int i = 1; i <= 6; i++)
            {
                People people = new People() { Name = "Dai_" + i.ToString(), Age = 16, Birthday = DateTime.Now, IsBuyCar = true, Sex = "F" };
                peopleList.Add(people);
            }
            Expression<Func<People, bool>> func_a = GetAndLambdaExpression<People>(new string[] { "Name", "Age" }, new string[] { "Dai_2", "16" }, new string[] { "=", "<" });
            var people_data = peopleList.AsEnumerable().Where(func_a.Compile()).ToList();

linq to sql 动态构建查询表达式树的更多相关文章

  1. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

  2. 动态构建Lambda表达式实现EF动态查询

    在使用Entity Framework做数据查询的时候,查询条件往往不是固定的,需要动态查询.可以通过动态构建Lamda表达式来实现动态查询. Lamda表达式 使用Lamda表达式可以很方便的按条件 ...

  3. Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

    在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...

  4. Linq to Sql : 动态构造Expression进行动态查询

    原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...

  5. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  6. (转)QueryBuilder : 打造优雅的Linq To SQL动态查询

    原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...

  7. 认识LINQ的第一步---从查询表达式开始

    学习和使用C#已经有2个月了,在这两个月的学习中,深刻体会到,C#这门语言还真不适合编程初学者学习,因为它是吸取了很多其他语言,不仅是面向对象,还包括函数式语言的很多特性,导致它变成特性大爆炸的语言. ...

  8. Linq To Sql 语法 子查询 & In & Join

    子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers                    where                  ...

  9. Linq To sql入门练习 Lambda表达式基础

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

随机推荐

  1. Docker实践4: 基于nginx对后端的weblogic负载均衡

    为什么要用Nginx(抄了一段) 1.nginx相对于apache的优点: 轻量级,同样起web服务,比apache占用更少的内存及资源 抗并发,nginx处理请求是异步非阻塞的,而apache则是阻 ...

  2. iOS:MBProgressHUD的基本使用

    下载地址:https://github.com/jdg/MBProgressHUD/ //方式1.直接在View上show HUD = [[MBProgressHUD showHUDAddedTo:s ...

  3. windows 7系统搭建PHP网站环境

    2.新建数据库打开浏览器,输入http://localhost:9999或者http://127.0.0.1:9999回车填写用户名root和密码回车登录点击权限-添加新用户填写用户名,主机选择本地, ...

  4. spring+mybatis项目启动报错Initializing Spring root WebApplicationContext

    这个问题很怪异,各种各样的情况都会导致这个问题的出现,主要是由于sping加载读取配置文件的时候出了问题.我在处理mybatis的时候出现了这个问题,后来排查发现,在mybatis的配置文件中如果有大 ...

  5. Gitlab备份、迁移、恢复和升级

    Gitlab备份.迁移.恢复和升级 自建的Gitlab服务器常常会因为使用时间的增长,其空间容量等硬件需求都需要升级,或者迁移至更高配置的服务器上.备份.迁移.恢复.升级过程如下 1.gitlab备份 ...

  6. Node.js meitulu图片批量下载爬虫1.04版

    //====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...

  7. CentOS下安装实时检測网络带宽的小工具bmon

    首先下载rpmforge-release扩展的rpm包 32位操作系统:wget http://www.sudu.us/Tools/bmon/rpmforge-release-0.3.6-1.el5. ...

  8. 设置客户端连接PostgreSQL不需要密码

    平常工作中,有时需要远端连接 PostgreSQL 数据库做些维护,例如远端备份等:如果备份脚本写在远端机器,备份的时候会弹出密码输入提示,那么脚本就不能后台执行,这里总结了几种不弹出密码输入提示的方 ...

  9. 基于Jekyll的博客模板

    代码地址如下:http://www.demodashi.com/demo/13147.html 效果 环境配置 环境 Windows 10 Git Bash 安装ruby 下载rubyinstalle ...

  10. Oracle学习笔记(5)——查询

    基本查询语句 SELECT [DISTINCT] column_name1,...|* FROM table_name [WHERE conditions] 在SQL*PLUS中设置格式 更改显示字段 ...