(这个类是很早以前在网上找的,忘记出处请原谅。)

一、基本用法

[Route("List")]
public ApiResult GetList(int page, int limit, string sort = null, string order = null, string filters = null, string query = null)
{
    PageModel p = new PageModel();
    if (filters != null)
    {
        p.filters = Newtonsoft.Json.JsonConvert.DeserializeObject<Filter[]>(filters);
    }

    p.page = page;
    p.rows = limit;
    p.sort = sort;
    p.order = order;

    )
    {
        p.page = ;
    }
    )
    {
        p.rows = ;
    }

    var data = manage.GetQueryable().Select(d => d);
    //过滤
    data = data.Where(p.filters);
    //搜索条件
    )
    {
        data = data.Where(new string[] { "UserName", "RealName" }, query);
    }
    //排序
    if (order != "normal" && sort != null)
    {
        bool isAsc = order == "asc";
        data = data.OrderBy(new[] { sort }, new[] { isAsc });
    }
    else
    {
        //默认排序
        data = data.OrderBy(d => d.UserID);
    }

    DataModel pageData = new DataModel();
    pageData.page = p.page;
    pageData.total = data.Count();
    pageData.rows = data.Skip((p.page - ) * p.rows).Take(p.rows).ToList();

    ApiResult result = new ApiResult();
    result.success = true;
    result.data = pageData;
    return result;
}

完整案例:结合前端 elementUI 组件 可以实现分页 查询、排序、过滤等。

https://www.cnblogs.com/hao-1234-1234/p/9647322.html#4225885

二、linq 帮助类

重写了where和orderby方法。

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
 using System.Web;
 using Vegetable.Models;

 namespace Vegetable.DAL
 {
     public static class QueryableExtension
     {

         public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string[] propertyName, bool[] ascending) where T : class
         {
             Type type = typeof(T);

             ; i < propertyName.Length; i++)
             {

                 PropertyInfo property = type.GetProperty(propertyName[i]);
                 if (property == null)
                     throw new ArgumentException("propertyName", "Not Exist");

                 ParameterExpression param = Expression.Parameter(type, "p");
                 Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property);
                 LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param);

                 string methodName = ascending[i] ? "OrderBy" : "OrderByDescending";
                 )
                 {
                     methodName = ascending[i] ? "ThenBy" : "ThenByDescending";
                 }

                 MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression));
                 source = source.Provider.CreateQuery<T>(resultExp);

             }

             return source;
         }

         public static IQueryable<T> Where<T>(this IQueryable<T> source, FilterRule[] filterRules) where T : class
         {
             if (filterRules == null)
             {
                 return source;
             }
             Type type = typeof(T);

             ParameterExpression param = Expression.Parameter(type, "c");

             Expression<Func<T, bool>> op = null;

             foreach (var rule in filterRules)
             {
                 PropertyInfo property = type.GetProperty(rule.Field);
                 if (property == null)
                 {
                     continue;
                 }
                 //c.Field==Value
                 //c=>c.Field.Contains(Value)
                 Expression left = Expression.Property(param, property);

                 Expression right = Expression.Constant(rule.Value);
                 Type valueType = property.PropertyType;
                 if (rule.Value == null || rule.Value == "") continue;
                 DateTime inputDateTime = DateTime.Now;
                 try
                 {

                     if (valueType == typeof(int) || valueType == typeof(int?))
                     {
                         right = Expression.Constant(Convert.ToInt32(rule.Value.Split(]));
                     }
                     else if (valueType == typeof(short) || valueType == typeof(short?))
                     {
                         right = Expression.Constant(Convert.ToInt16(rule.Value.Split(]));
                     }
                     else if (valueType == typeof(byte) || valueType == typeof(byte?))
                     {
                         right = Expression.Constant(Convert.ToByte(rule.Value.Split(]));
                     }
                     else if (valueType == typeof(long) || valueType == typeof(long?))
                     {
                         right = Expression.Constant(Convert.ToInt64(rule.Value));
                     }
                     else if (valueType == typeof(float) || valueType == typeof(float?))
                     {
                         right = Expression.Constant(Convert.ToSingle(rule.Value));
                     }
                     else if (valueType == typeof(double) || valueType == typeof(double?))
                     {
                         right = Expression.Constant(Convert.ToDouble(rule.Value));
                     }
                     else if (valueType == typeof(decimal) || valueType == typeof(decimal?))
                     {
                         right = Expression.Constant(Convert.ToDecimal(rule.Value));
                     }
                     else if (valueType == typeof(DateTime) || valueType == typeof(DateTime?))
                     {
                         inputDateTime = Convert.ToDateTime(rule.Value);
                         right = Expression.Constant(Convert.ToDateTime(rule.Value));
                     }
                     else if (valueType == typeof(Guid) || valueType == typeof(Guid?))
                     {
                         right = Expression.Constant(Guid.Parse(rule.Value));
                     }

                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message);
                     break;
                 }

                 Expression filter = Expression.Equal(left, right);
                 Expression filter2 = null;
                 MethodInfo method;

                 switch (rule.Op)
                 {
                     case OP.contains:
                         //BinaryExpression
                         if (valueType == typeof(string))
                         {
                             method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
                             filter = Expression.Call(left, method, right);
                         }
                         else if (valueType == typeof(DateTime) || valueType == typeof(DateTime?))
                         {
                             right = Expression.Constant(inputDateTime.Date);
                             filter = Expression.GreaterThanOrEqual(left, right);
                             right = Expression.Constant(inputDateTime.Date.AddDays());
                             filter2 = Expression.LessThan(left, right);
                         }
                         else
                         {
                             filter = Expression.Equal(left, right);
                         }
                         break;
                     case OP.equal:
                         filter = Expression.Equal(left, right);
                         break;
                     case OP.notequal:
                         filter = Expression.NotEqual(left, right);
                         break;
                     case OP.beginwith:
                         method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });

                         filter = Expression.Call(left, method, right);
                         break;
                     case OP.endwith:
                         method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });

                         filter = Expression.Call(left, method, right);
                         break;
                     case OP.less:
                         filter = Expression.LessThan(left, right);
                         break;
                     case OP.lessorequal:
                         filter = Expression.LessThanOrEqual(left, right);
                         break;
                     case OP.greater:
                         filter = Expression.GreaterThan(left, right);
                         break;
                     case OP.greaterorequal:
                         filter = Expression.GreaterThanOrEqual(left, right);
                         break;
                     default:
                         break;
                 }

                 var lambda = Expression.Lambda<Func<T, bool>>(filter, param);
                 if (op == null)
                 {
                     op = lambda;
                 }
                 else
                 {
                     op = Expression.Lambda<Func<T, bool>>(Expression.And(op.Body, lambda.Body), op.Parameters);
                 }

                 if (filter2 != null)
                 {
                     var lambda2 = Expression.Lambda<Func<T, bool>>(filter2, param);
                     op = Expression.Lambda<Func<T, bool>>(Expression.And(op.Body, lambda2.Body), op.Parameters);
                 }
             }

             if (op != null)
             {
                 source = source.Where(op);
             }
             return source;
         }

         public static IQueryable<T> Where<T>(this IQueryable<T> source, Filter[] filters) where T : class
         {
             if (filters == null)
             {
                 return source;
             }
             Type type = typeof(T);

             ParameterExpression param = Expression.Parameter(type, "c");

             Expression<Func<T, bool>> op = null;

             foreach (var rule in filters)
             {
                 PropertyInfo property = type.GetProperty(rule.Field);
                 if (property == null)
                 {
                     continue;
                 }
                 //c.Field==Value
                 //c=>(c.Field.Contains(Value) || c.Field.Contains(Value))
                 Exception outExc = new Exception();

                 Expression left = Expression.Property(param, property);
                 Type valueType = property.PropertyType;
                 ) continue;

                 Expression<Func<T, bool>> lambdaOut = null;
                 foreach (var v in rule.Value)
                 {
                     Expression right = Expression.Constant(v);
                     DateTime inputDateTime = DateTime.Now;
                     try
                     {

                         if (valueType == typeof(int) || valueType == typeof(int?))
                         {
                             right = Expression.Constant(Convert.ToInt32(v.Split(]));
                         }
                         else if (valueType == typeof(short) || valueType == typeof(short?))
                         {
                             right = Expression.Constant(Convert.ToInt16(v.Split(]));
                         }
                         else if (valueType == typeof(byte) || valueType == typeof(byte?))
                         {
                             right = Expression.Constant(Convert.ToByte(v.Split(]));
                         }
                         else if (valueType == typeof(long) || valueType == typeof(long?))
                         {
                             right = Expression.Constant(Convert.ToInt64(v));
                         }
                         else if (valueType == typeof(float) || valueType == typeof(float?))
                         {
                             right = Expression.Constant(Convert.ToSingle(v));
                         }
                         else if (valueType == typeof(double) || valueType == typeof(double?))
                         {
                             right = Expression.Constant(Convert.ToDouble(v));
                         }
                         else if (valueType == typeof(decimal) || valueType == typeof(decimal?))
                         {
                             right = Expression.Constant(Convert.ToDecimal(v));
                         }
                         else if (valueType == typeof(DateTime) || valueType == typeof(DateTime?))
                         {
                             inputDateTime = Convert.ToDateTime(v);
                             right = Expression.Constant(Convert.ToDateTime(v));
                         }
                         else if (valueType == typeof(Guid) || valueType == typeof(Guid?))
                         {
                             right = Expression.Constant(Guid.Parse(v));
                         }

                     }
                     catch (Exception ex)
                     {
                         Console.WriteLine(ex.Message);
                         break;
                     }

                     Expression filter = Expression.Equal(left, right);
                     Expression filter2 = null;
                     MethodInfo method;

                     switch (rule.Op)
                     {
                         case OP.contains:
                             //BinaryExpression
                             if (valueType == typeof(string))
                             {
                                 method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
                                 filter = Expression.Call(left, method, right);
                             }
                             else if (valueType == typeof(DateTime) || valueType == typeof(DateTime?))
                             {
                                 right = Expression.Constant(inputDateTime.Date);
                                 filter = Expression.GreaterThanOrEqual(left, right);
                                 right = Expression.Constant(inputDateTime.Date.AddDays());
                                 filter2 = Expression.LessThan(left, right);
                             }
                             else
                             {
                                 filter = Expression.Equal(left, right);
                             }
                             break;
                         case OP.equal:
                             filter = Expression.Equal(left, right);
                             break;
                         case OP.notequal:
                             filter = Expression.NotEqual(left, right);
                             break;
                         case OP.beginwith:
                             method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });

                             filter = Expression.Call(left, method, right);
                             break;
                         case OP.endwith:
                             method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });

                             filter = Expression.Call(left, method, right);
                             break;
                         case OP.less:
                             filter = Expression.LessThan(left, right);
                             break;
                         case OP.lessorequal:
                             filter = Expression.LessThanOrEqual(left, right);
                             break;
                         case OP.greater:
                             filter = Expression.GreaterThan(left, right);
                             break;
                         case OP.greaterorequal:
                             filter = Expression.GreaterThanOrEqual(left, right);
                             break;
                         default:
                             break;
                     }

                     var lambda = Expression.Lambda<Func<T, bool>>(filter, param);
                     if (lambdaOut == null)
                     {
                         lambdaOut = lambda;
                     }
                     else
                     {
                         lambdaOut = Expression.Lambda<Func<T, bool>>(Expression.Or(lambdaOut.Body, lambda.Body), lambdaOut.Parameters);
                     }

                     if (filter2 != null)
                     {
                         var lambda2 = Expression.Lambda<Func<T, bool>>(filter2, param);
                         lambdaOut = Expression.Lambda<Func<T, bool>>(Expression.And(lambdaOut.Body, lambda2.Body), lambdaOut.Parameters);
                     }
                 }
                 if (op == null)
                 {
                     op = lambdaOut;
                 }
                 else
                 {
                     op = Expression.Lambda<Func<T, bool>>(Expression.And(op.Body, lambdaOut.Body), op.Parameters);
                 }

             }
             if (op != null)
             {
                 source = source.Where(op);
             }
             return source;

         }

         public static IQueryable<T> Where<T>(this IQueryable<T> source, string[] columnNames, string filterString)
         {

             Type type = typeof(T);

             ParameterExpression param = Expression.Parameter(type, "c");

             Expression right = Expression.Constant(filterString);

             //1!=1
             //Expression op = Expression.NotEqual(Expression.Constant(1), Expression.Constant(1));
             Expression<Func<T, bool>> op = null;

             foreach (var column in columnNames)
             {
                 PropertyInfo property = type.GetProperty(column);
                 if (property == null)
                 {
                     continue;
                 }
                 //c.Field==Value
                 //c=>c.Field.Contains(Value)
                 Expression left = Expression.Property(param, property);

                 Type valueType = property.PropertyType;
                 if (valueType != typeof(string)) continue;
                 if (filterString == null || filterString == "") continue;

                 MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });

                 Expression filter = Expression.Call(left, method, right);

                 var lambda = Expression.Lambda<Func<T, bool>>(filter, param);
                 if (op == null)
                 {
                     op = lambda;
                 }
                 else
                 {

                     op = Expression.Lambda<Func<T, bool>>(Expression.Or(op.Body, lambda.Body), op.Parameters);
                 }
             }

             if (op != null)
             {

                 source = source.Where(op);
             }
             return source;
         }
     }
 }

EF 拉姆达 linq 帮助类的更多相关文章

  1. EF 拉姆达 linq if else (整理)

    首先想到: var data0 = db.T_Plants2; //这里加.AsQueryable() ) { .Where(d => d.NaturalEcosystem == true); ...

  2. EF 拉姆达 动态拼接查询语句

    EF 动态拼接查询语句 using System; using System.Collections.Generic; using System.IO; using System.Linq; usin ...

  3. C# 匿名方法和拉姆达表达式

    有时候,我们需要封装一组数据,只有数据,没有方法,并且只用于当前程序,不需要在项目间重用,这时候,如果是传统的使用类来封装的话,大概会是下面这种样子: internal class SomeData ...

  4. C#进阶之路(四):拉姆达

    对于拉姆达,许多文章都讲过原理及如何使用,所以这篇文章我主要是摘录我学习过的文字,总结下我自己的学习心得. 什么是拉姆达表达式 "Lambda表达式"是一个匿名函数,是一种高效的类 ...

  5. C#拉姆达(=>)表达式

    前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似 ...

  6. 如何用拉姆达表达式(Lambda Expressions) 书写左链接查询

    在C#中,如果要实现两个列表的左链接查询,我们的一般用法就是用的linq表达式就是 List<Pet> pets = }, }, } }; List<Pet2> pets2 = ...

  7. SqlSugar常用查询实例-拉姆达表达式

    SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表 SqlSugarClient db = SugarContext.GetInstance( ...

  8. (转)拉姆达表达式(Lambda Expressions) =>写法的涵义

      lambdaclass编译器 让我们先看一个简单的拉姆达表达式: x=>x/2 这个表达式的意思是:x为参数,对x进行相应的操作后的结果作为返回值. 通过这个拉姆达表达式,我们可以看到: 这 ...

  9. Java8新特性(拉姆达表达式lambda)

    一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的java.lang.Runn ...

随机推荐

  1. LVS-DR模式部署流程

    情景一 一.环境介绍 1)RIP.VIP.DIP为同一物理网络 2)LVS Hostname:lvs eth0:DIP-192.168.3.31 eth0:0:VIP-192.168.3.10 3)R ...

  2. Scala 学习之路(十三)—— 隐式转换和隐式参数

    一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 clas ...

  3. 【设计模式】结构型02装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由 ...

  4. python安装Django常见错误

    今天没事安装了一下python的web框架,Django.自己踩了一些雷,记录下来,留给后面的学者们,不要踩同样的雷了. 1.pip版本过低,安装不了,升级pip指令 python -m pip in ...

  5. Java上机题(封装)(编写student类)

    今天帮大一的童鞋写Java上机题 题目虽然很简单,但是刚拿到题目的时候愣了一下,然后就疯狂get set QuQ 其实这是一个特别基本的封装的题目(之前实验室面试大二的时候竟然还有蛮多人不知道封装的概 ...

  6. Python 爬虫从入门到进阶之路(十四)

    之前的文章我们已经可以根据 re 模块,Xpath 模块和 BeautifulSoup4 模块来爬取网站上我们想要的数据并且存储在本地,但是我们并没有对存储数据的格式有要求,本章我们就来看数据的存储格 ...

  7. decimal.ToString()问题

    decimal dt = 1.00M;            decimal dt1 = 1M;                         bool d = dt == dt1;         ...

  8. 跟我学SpringCloud | 第十篇:服务网关Zuul高级篇

    SpringCloud系列教程 | 第十篇:服务网关Zuul高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全 ...

  9. vue.js打包部署线上

    你完成了工程开发,需要部署到外网环境,要进行下面的步骤: 一.首先你要购买一个服务器或者有自己的服务器.我介绍给大家的一个免费的服务器:http://free.3v.do/index.html可以免费 ...

  10. 02(b)多元无约束优化问题-最速下降法

    此部分内容接02(a)多元无约束优化问题的内容! 第一类:最速下降法(Steepest descent method) \[f({{\mathbf{x}}_{k}}+\mathbf{\delta }) ...