Linq Where Expression<Func<T,bool;;查询条件
Posted kueizheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linq Where Expression<Func<T,bool;;查询条件相关的知识,希望对你有一定的参考价值。
添加类ExpressionExtensions类:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; namespace API.Common { public static class ExpressionExtensions { /// <summary> /// 添加And条件 /// </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.AndAlso<T>(second, Expression.AndAlso); } /// <summary> /// 添加Or条件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="first"></param> /// <param name="second"></param> /// <returns></returns> public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { return first.AndAlso<T>(second, Expression.OrElse); } /// <summary> /// 合并表达式以及参数 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expr1"></param> /// <param name="expr2"></param> /// <param name="func"></param> /// <returns></returns> private static Expression<Func<T, bool>> AndAlso<T>( this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2, Func<Expression, Expression, BinaryExpression> func) { var parameter = Expression.Parameter(typeof(T)); var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter); var left = leftVisitor.Visit(expr1.Body); var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter); var right = rightVisitor.Visit(expr2.Body); return Expression.Lambda<Func<T, bool>>(func(left, right), parameter); } private class ReplaceExpressionVisitor : ExpressionVisitor { private readonly Expression _oldValue; private readonly Expression _newValue; public ReplaceExpressionVisitor(Expression oldValue, Expression newValue) { _oldValue = oldValue; _newValue = newValue; } public override Expression Visit(Expression node) { if (node == _oldValue) return _newValue; return base.Visit(node); } } } }
简单使用:
Expression<Func<hospital, bool>> filter = u => u.status != -1; filter = filter.And(c => c.name.Contains("第三医院")); filter = filter.Or(c => c.name.Contains("第二医院")); List<hospital> list = new List<hospital>(); list = list.AsQueryable().Where(filter).ToList();
参考:http://www.zyiz.net/tech/detail-133201.html
以上是关于Linq Where Expression<Func<T,bool;;查询条件的主要内容,如果未能解决你的问题,请参考以下文章
LINQ 学习路程 -- 查询操作 Expression Tree
将 List<Expression<Func<T, bool>>> 组合到 OR 子句 LINQ [重复]