Expression<Func<bool>>
lINQ verwendet häufig die Expression, die Expression ist eine Darstellung der Lambda -Expression. Bei der Verarbeitung von Ausdrücken werden häufig zwei logische Ausdrücke benötigt, z. B. und oder oder nicht.
Möglicherweise möchten wir diese Ausdrücke kombinieren, um den gleichen neuen Ausdruck zu erhalten:
Expression<Func<bool>> expr1; Expression<Func<bool>> expr2;
<合> Der Ausdruck der Kombination mit denselben Parametern
// 示例用法(原样无效) Expression<Func<bool>> andExpression = expr1 AND expr2;
Wenn <<> und die gleichen Parameter verwenden, ist die Operation sehr einfach:
<合> Der Ausdruck verschiedener Parameter mit einer Kombination expr1
expr2
var body = Expression.AndAlso(expr1.Body, expr2.Body); var lambda = Expression.Lambda<Func<bool>>(body, expr1.Parameters[0]);
<用> Allgemeine Methode
Das folgende Codefragment bietet eine gemeinsame Methode, um den am besten geeigneten Weg zu bestimmen, um den Kombinationsausdruck zu bestimmen: Invoke
static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> left, Expression<Func<bool>> right) { var param = Expression.Parameter(typeof(T), "x"); var body = Expression.AndAlso( Expression.Invoke(left, param), Expression.Invoke(right, param) ); var lambda = Expression.Lambda<Func<bool>>(body, param); return lambda; }
In .NET 4.0 und höhere Versionen können Sie
Klasse verwenden, um EF -Sicherheitsausdrücke zu erstellen:
static Expression<Func<bool>> AndAlso<T>( this Expression<Func<bool>> expr1, Expression<Func<bool>> expr2) { ParameterExpression param = expr1.Parameters[0]; if (ReferenceEquals(param, expr2.Parameters[0])) { return Expression.Lambda<Func<bool>>( Expression.AndAlso(expr1.Body, expr2.Body), param); } return Expression.Lambda<Func<bool>>( Expression.AndAlso( expr1.Body, Expression.Invoke(expr2, param)), param); }
Das obige ist der detaillierte Inhalt vonWie kombinieren Sie logische Ausdrücke vom Typ 'Expression' in Linq?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!