dua ungkapan kombinasi (ekspresi
ungkapan jenis dengan pengendali logik (seperti dan, atau, atau tidak).
penyelesaian
Untuk menggunakan dua ungkapan pengendali logik, anda boleh memilih kaedah berikut:<code>Expression<func bool="">> expr1; Expression<func bool="">> expr2; ... // 这不会按预期工作 Expression<func bool="">> andExpression = expr1 AND expr2;</code>
Jika anda menggunakan parameterexpression yang sama dalam expr1 dan expr2, anda hanya boleh menggabungkan teks mereka dan menggunakan parameter asal untuk membuat ungkapan lambda baru.
<code>var body = Expression.AndAlso(expr1.Body, expr2.Body); var lambda = Expression.Lambda<func bool="">(body, expr1.Parameters[0]);</code>
Jika dua ungkapan menggunakan contoh parameterexpression yang berbeza, menurut penyedia LINQ anda, anda boleh menggunakan Invoke untuk menggabungkannya:
<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>
Kaedah 3: Versi Umum
<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>
Versi ini secara automatik akan mengesan sama ada kedua -dua ungkapan menggunakan parameter yang sama dan menyesuaikan ungkapan dengan sewajarnya:
Untuk .NET 4.0 dan versi yang lebih tinggi, anda boleh menggunakan kelas ExpressionVisitor untuk membuat ekspresi keselamatan EF. Kaedah ini membolehkan anda menggantikan parameter asal dengan bilangan parameter baru tanpa penukaran eksplisit:
<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>
Atas ialah kandungan terperinci Bagaimana menggabungkan dua ekspresi ekspresi menggunakan pengendali logik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!