日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#條件拼接Expression<Func<T,?bool>>的使用_C#教程

作者:風,停下 ? 更新時間: 2022-04-25 編程語言

使用代碼

特別注意 :拼接條件時,所使用到的條件strID,strBir必須是獨立的

var predicate = PredicateBuilder.GetTrue();
predicate = predicate.And(it => it.id.ToString().Contains(strID));
predicate = predicate.And(it => it.Birthday.ToString().Contains(strBir));
predicate = predicate.And(it => it.Sex.ToString().Contains(strSex));
predicate = predicate.And(it => it.Age == 20);
var lst = db.Queryable.Where(predicate).ToList();

工具類

using System;
using System.Linq.Expressions;

namespace WindowsFormsApp1.Tools
{
? ? public static class PredicateBuilder
? ? {
? ? ? ? public static Expression> GetTrue() { return f => true; }
? ? ? ? public static Expression> GetFalse() { return f => false; }

? ? ? ? public static Expression> And(this Expression> first, Expression> second)
? ? ? ? {
? ? ? ? ? ? return first.AndAlso(second, Expression.AndAlso);
? ? ? ? }

? ? ? ? public static Expression> Or(this Expression> first, Expression> second)
? ? ? ? {
? ? ? ? ? ? return first.AndAlso(second, Expression.OrElse);
? ? ? ? }

? ? ? ? private static Expression> AndAlso(this Expression> expr1, Expression> expr2, Func 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(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);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

原文鏈接:https://blog.csdn.net/weixin_47492910/article/details/116020315

欄目分類
最近更新