Predicate提取
用EF或者其他ORM的经常会有传入如入参数的,
System.Linq.Expressions> predicate
这时如果要拼接条件的话需要个PredicateBuilder类的,以下代码是从CoreShop源码中提取的
using System; using System.Linq; using System.Linq.Expressions; namespace CoreCms.Net.Model.Entities.Expression { public static class PredicateBuilder { public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<System.Linq.Expressions.Expression, System.Linq.Expressions.Expression, System.Linq.Expressions.Expression> merge) { // build parameter 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 parameters from the first var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); // apply composition of lambda expression bodies to parameters from the first expression return System.Linq.Expressions.Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters); } /// <summary> /// 扩展啦 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="first"></param> /// <param name="second"></param> /// <returns></returns> public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { return first.Compose(second, System.Linq.Expressions.Expression.AndAlso); } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { return first.Compose(second, System.Linq.Expressions.Expression.OrElse); } } }
使用:
/// <summary> /// 获取新闻列表 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpGet] [AllowAnonymous] public NiunanAPIResult GetList([FromQuery] NiunanNewsSearchInput model) { try { var express = PredicateBuilder.True<NiunanNews>(); if (model.userid > 0) { express = express.And(a => a.UserId == model.userid); } var list = _niunannewsServices.QueryPage(express, "id desc", model.pageindex, model.pagesize); return new NiunanAPIResult() { code = 0, msg = "成功获取新闻列表", data = list }; } catch (Exception ex) { return new NiunanAPIResult() { code = -1, msg = "获取新闻列表出错:" + ex.Message }; } }