Deux expressions de combinaison (expression
de type avec des opérateurs logiques (tels que et, ou non).
Solution
Pour utiliser les deux expressions d'opérateurs logiques, vous pouvez choisir les méthodes suivantes:<code>Expression<func bool="">> expr1; Expression<func bool="">> expr2; ... // 这不会按预期工作 Expression<func bool="">> andExpression = expr1 AND expr2;</code>
Si vous utilisez la même paramètres de paramètres dans expr1 et expr2, vous pouvez simplement combiner leur texte et utiliser le paramètre d'origine pour créer une nouvelle expression Lambda.
<code>var body = Expression.AndAlso(expr1.Body, expr2.Body); var lambda = Expression.Lambda<func bool="">(body, expr1.Parameters[0]);</code>
Si deux expressions utilisent différentes instances de paramètres de paramètres, selon votre fournisseur LINQ, vous pouvez utiliser Invoke pour les combiner:
<code>static Expression<func bool=""> Not<T>( this Expression<func bool=""> expr) { return Expression.Lambda<func bool="">( Expression.Not(expr.Body), expr.Parameters[0]); }</code>
Méthode 3: version générale
<code>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; }</code>
Cette version détectera automatiquement si les deux expressions utilisent les mêmes paramètres et ajusteront l'expression en conséquence:
Pour .NET 4.0 et des versions supérieures, vous pouvez utiliser la classe ExpressionVisitor pour créer une expression de sécurité EF. Cette méthode vous permet de remplacer le paramètre d'origine par le nombre de nouveaux paramètres sans conversion explicite:
<code>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); } // 否则,使用 Invoke 来组合 return Expression.Lambda<func bool="">( Expression.AndAlso( expr1.Body, Expression.Invoke(expr2, param)), param); }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!