当前位置: 首页 > news >正文

Linq动态条件

很多情况下,我们开发程序,需要动态拼接SQL查询语句;

比如  select top 1 * from User where age= 18  and  name = 'renruiquan'

其中红色的代码,是我们需要根据查询条件是否为空,来判,要不要加在查询的SQL里;

换成Linq里就不能这么直接的去拼接了,好在国外的大神有给我们解决方案。下面直接上代码:

新手同学不需要关心代码具体是怎么实现的,只需要知道怎么调用就好。当然,你能研究一下,给自己充电,也是再好不过了

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;


namespace JQ.GameClient.Common
{
    /// <summary>
    /// Enables the efficient, dynamic composition of query predicates.
    /// </summary>
    public static class PredicateBuilder
    {
        /// <summary>
        /// Creates a predicate that evaluates to true.
        /// </summary>
        public static Expression<Func<T, bool>> True<T>() { return param => true; }

        /// <summary>
        /// Creates a predicate that evaluates to false.
        /// </summary>
        public static Expression<Func<T, bool>> False<T>() { return param => false; }

        /// <summary>
        /// Creates a predicate expression from the specified lambda expression.
        /// </summary>
        public static Expression<Func<T, bool>> Create<T>(Expression<Func<T, bool>> predicate) { return predicate; }

        /// <summary>
        /// Combines the first predicate with the second using the logical "and".
        /// </summary>
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.AndAlso);
        }

        /// <summary>
        /// Combines the first predicate with the second using the logical "or".
        /// </summary>
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.OrElse);
        }

        /// <summary>
        /// Negates the predicate.
        /// </summary>
        public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expression)
        {
            var negated = Expression.Not(expression.Body);
            return Expression.Lambda<Func<T, bool>>(negated, expression.Parameters);
        }

        /// <summary>
        /// Combines the first expression with the second using the specified merge function.
        /// </summary>
        static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
            // zip parameters (map from parameters of second to parameters of first)
            var map = first.Parameters
                .Select((f, i) => new { f, s = second.Parameters[i] })
                .ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with the parameters in the first
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // create a merged lambda expression with parameters from the first expression
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        /// <summary>
        /// ParameterRebinder
        /// </summary>
        class ParameterRebinder : ExpressionVisitor
        {
            /// <summary>
            /// The ParameterExpression map
            /// </summary>
            readonly Dictionary<ParameterExpression, ParameterExpression> map;

            /// <summary>
            /// Initializes a new instance of the <see cref="ParameterRebinder"/> class.
            /// </summary>
            /// <param name="map">The map.</param>
            ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
            {
                this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
            }

            /// <summary>
            /// Replaces the parameters.
            /// </summary>
            /// <param name="map">The map.</param>
            /// <param name="exp">The exp.</param>
            /// <returns>Expression</returns>
            public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
            {
                return new ParameterRebinder(map).Visit(exp);
            }

            /// <summary>
            /// Visits the parameter.
            /// </summary>
            /// <param name="p">The p.</param>
            /// <returns>Expression</returns>
            protected override Expression VisitParameter(ParameterExpression p)
            {
                ParameterExpression replacement;

                if (map.TryGetValue(p, out replacement))
                {
                    p = replacement;
                }

                return base.VisitParameter(p);
            }
        }
    }

}

代码调用:

            //动态构造查询条件
            var predicate = PredicateBuilder.True<UserInfo>();
       //查询用户状态为1的数据
            predicate = predicate.And(x => x.status == 1);

            if (!string.IsNullOrEmpty(name))
            {
         //如果查询的用户名不为空,则拼接表达式 predicate
= predicate.And(x => x.name == name); } var list = bll.GetList<UserInfo>(predicate,o=>o.orderno);

其中UserInfo为用户表的实体类。

list即为查询的结果。

相关文章:

  • 详解java1.5新添特性------注解
  • Windows下批量设置SVN用户组权限
  • windows中eclipse打开当前文件所在文件夹
  • Effective C++: auto类型推断.
  • 利用CSS-border属性实现圆饼图表
  • 大圣归来:我们心中缺少一份英雄主义
  • Java命令学习系列(7):Javap(转)
  • 用VS2010编C#程序扫盲
  • 微软宣布Visual Studio 2015后继版本,开发者可以使用Visual C++ for Linux了
  • fullPage.js全屏滚动插件 中文帮助文档API
  • 9个 SSH常用命令选项(转载)
  • 二叉树的操作
  • jquery 的队列queue
  • CentOS下载
  • 开始学习第一天
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 2017前端实习生面试总结
  • CAP理论的例子讲解
  • Computed property XXX was assigned to but it has no setter
  • C语言笔记(第一章:C语言编程)
  • github从入门到放弃(1)
  • HTTP--网络协议分层,http历史(二)
  • Linux后台研发超实用命令总结
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • Mac 上flink的安装与启动
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014#Day.2 T3 解方程
  • #pragma pack(1)
  • (1)虚拟机的安装与使用,linux系统安装
  • (层次遍历)104. 二叉树的最大深度
  • (转)linux 命令大全
  • (转)Sublime Text3配置Lua运行环境
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .describe() python_Python-Win32com-Excel
  • .NET : 在VS2008中计算代码度量值
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 中让 Task 支持带超时的异步等待
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .netcore 获取appsettings
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net生成的类,跨工程调用显示注释
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /proc/stat文件详解(翻译)