C#WebAPI根据参数生成Lambda表达式

在项目开发中会遇到很多使用lambda表达式的情况,每次都需要判断条件然后在执行代码,对于一个参数可选的接口来说。实现更麻烦。后来在网上看到这种方法。分享给大家。写的不好的地方多多包涵。
一开始自己尝试动态生成lambda表达式。多次尝试都不尽人意,后来在nuget中发现了linqkit这个工具。个人感觉非常强大。Linqkit Git库中有详细的代码和文档,你完全可以把他的代码clone下来然后根据自己的需要进行修改。

上例子:

public async Task<IHttpActionResult> GetLogInfo(string userName=null,string beginTime=null,string endTime=null,string module=null,int pageIndex=1,int pageSize=20)
        {
            try
            {
                var loggerPredicate = PredicateBuilder.New<Logger>(f=>true);
                if (userName != null)
                {
                    loggerPredicate.And(l=>l.UserName==userName);
                }
                if (beginTime != null)
                {
                    var begintime = DateTime.Parse(beginTime);
                    loggerPredicate.And(l=>l.HappenedTime>=begintime);
                }
                if (endTime != null)
                {
                    var endtime = DateTime.Parse(endTime);
                    loggerPredicate.And(l => l.HappenedTime <= endtime);
                }
                if (module != null)
                {
                    loggerPredicate.And(l=>l.Module==module);
                }

                var loggerList = loggerActionSet.GetPagedList(
                        predicate: loggerPredicate,
                        selector: l => l,
                        orderBy: ll => ll.OrderByDescending(l => l.HappenedTime),
                        pageSize: pageSize,
                        pageIndex: pageIndex - 1
                        );

                return Json(new {
                    result = true,
                    data = new {
                        loggerList.HasNextPage,
                        loggerList.HasPreviousPage,
                        loggerList.PageIndex,
                        loggerList.PageSize,
                        loggerList.TotalCount,
                        loggerList.TotalPages,
                        loggerList.IndexFrom,
                        Items=loggerList.Items.Select(l=> new
                        {
                            l.Id,
                            HappenedTime = l.HappenedTime.ToString("yyyy-MM-dd hh:mm:ss"),
                            l.UserName,
                            l.Module,
                            l.Description,
                            OperationResult = l.OperationResult == true ? "成功" : "失败"
                        }),
                    }
                });

            }
            catch (Exception)
            {
                return Json(new {result=false,msg="系统错误" });
            }
        }

如代码所示。这个webapi中包括4个参数,每个参数都是可选的,linqlit允许你把各个参数进行判断,然后最后生成lambda表达式。个人感觉比之前一个参数一个参数的判断然后执行代码显得更加简洁和一目了然。还请各位大佬多多指教

原文地址:https://www.cnblogs.com/liangbin-2019-03-30/p/11131986.html

时间: 2024-08-29 22:55:05

C#WebAPI根据参数生成Lambda表达式的相关文章

动态生成lambda表达式

//1.0 获取我的申请单 int uid = UserMgr.GetCurrentLoginUser().uID; //2.0 获取参数 string kname = f["kname"]; string status = f["status"]; //第一个条件: var query= c => c.fCreatorID == uid //定义出一个c的参数,它的类型为wfReqeustForm var ps = Expression.Parameter(

根据表达式树动态生成Lambda表达式

1.准备 环境:Asp.Net MVC5 .EF6 前置知识:反射.使用过EF编写过Lambda表达式 2.基础类库 2.1该高级条件的类型 1 /// <summary> 2 /// 当前条件所属类型 3 /// </summary> 4 public enum Em_AS_ConditionType 5 { 6 /// <summary> 7 /// 并 8 /// </summary> 9 [Description("并")] 10

SqlDataReader生成动态Lambda表达式

上一扁使用动态lambda表达式来将DataTable转换成实体,比直接用反射快了不少.主要是首行转换的时候动态生成了委托. 后面的转换都是直接调用委托,省去了多次用反射带来的性能损失. 今天在对SqlServer返回的流对象 SqlDataReader 进行处理,也采用动态生成Lambda表达式的方式转换实体. 先上一版代码 1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using Syst

兰姆达表达式Lambda 表达式(C# 编程指南)

转https://msdn.microsoft.com/zh-cn/library/bb397687.aspx Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda 表达式 x => x

不一样的编码风格--Lambda表达式

Lambda表达式也是C#3.0中最重要的特性之一. 1.Lambda表达式的简介 Lambda表达式可以理解为一个匿名方法,它可以包含表达式和语句,并且用于创建委托或转换为表达式树.在使用Lambda表达式时,都会使用“=>”运算符,该运算符的左边是匿名方法的输入参数,右边则是表达式或语句块. 1.1 Lambda表达式的演变过程 其实Lambda表达式是匿名方法的投胎转世.下面以代码来鉴定: 1 C# 1.0 2 Func<string,int> delegatetest1=new

Java8新增的Lambda表达式

Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简单的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. 5.8.1 Lambda 表达式入门 Command.java package code; public interface Command { // 接口里定义的process()方法用于封装"处理行为" void process(int[] target); } ProcessArray.java package code; publi

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

Lambda 表达式(C# 编程指南) 微软microsoft官方说明

Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值. 如下

Lambda表达式和Lambda表达式树

LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambda表达式不仅可以用他们创建委托实例,而且C#编译器也能将他们转换成表达式树——用于表示Lambda表达式逻辑的一种数据结构.简言之——Lambda表达式用符号语言习惯的方法来表示LINQ数据管线中的操作. 作为委托的Lambda表达式 Lambda有特殊转换规则:表达式的类型本身并非委托类型,但它可