LINQ动态查询类--[DynamicLinqExpressions]

时间:2023-03-08 16:26:38
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions; namespace Test
{
/// <summary>
/// 一個老外寫的擴充Expression方法的靜態類別,可以解決上面冗長的程式碼
/// </summary>
public static class DynamicLinqExpressions//注意static靜態型別
{
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; } //注意this
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);
}
}
}

使用示例:

 SchoolContainer school = new SchoolContainer();
var eps = DynamicLinqExpressions.True<Teacher>();
eps.And(T=>T.Name.Contains(""));
var ss = school.Teacher.Where(T => T.Name.Contains("PM")).Where(eps);
foreach (var item in ss)
{
Console.WriteLine(item.Name);
}