首页 > 技术文章 > c# Expression 扩展

robertyao 2019-02-14 10:25 原文

一、简介

当查询比较复杂时,需要很多判断或者跨方法传递参数时使用

二、扩展类

复制代码 

public static class DynamicLinqExpressions
{

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<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
}

public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
}

}

复制代码

三、如何使用

1.关于引用

using System.Linq;
using System.Linq.Expressions;  

2.使用示例

     Expression<Func<User, bool>> pre;
            pre = s => s.NickName.Contains("");
            pre = pre.Or(s => s.NickName.Contains(""));
            pre = pre.And(s => s.CompanyId == "1");

            var data = _userRepository.GetAll().AsExpandable().Where(pre);

 

推荐阅读