Rumah > pembangunan bahagian belakang > C++ > Bagaimana menggabungkan dua ekspresi ekspresi menggunakan pengendali logik?

Bagaimana menggabungkan dua ekspresi ekspresi menggunakan pengendali logik?

Patricia Arquette
Lepaskan: 2025-01-31 05:46:08
asal
487 orang telah melayarinya

How to Combine Two Expression Expressions Using Logical Operators?

dua ungkapan kombinasi (ekspresi

)

Dalam bidang operasi data, anda mungkin perlu menggunakan dua ungkapan

ungkapan jenis dengan pengendali logik (seperti dan, atau, atau tidak). cabaran

Serpihan kod berikut menggambarkan cabaran yang mungkin anda hadapi:

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>
Salin selepas log masuk

Kaedah 1: ParameterExpression yang sama

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.

Kaedah ini juga terpakai untuk menafikan satu ungkapan:

<code>var body = Expression.AndAlso(expr1.Body, expr2.Body);
var lambda = Expression.Lambda<func bool="">(body, expr1.Parameters[0]);</code>
Salin selepas log masuk
Kaedah 2: ParameterExpressions yang berbeza

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>
Salin selepas log masuk

Kaedah ini sesuai untuk dan dan atau operasi.

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>
Salin selepas log masuk

Versi ini secara automatik akan mengesan sama ada kedua -dua ungkapan menggunakan parameter yang sama dan menyesuaikan ungkapan dengan sewajarnya:

Gunakan ExpressionVisitor

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>
Salin selepas log masuk

Dengan menggunakan kaedah ini, anda boleh menggabungkan pelbagai ekspresi logik dan melakukan operasi pertanyaan yang kompleks pada data anda.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan