obj.Prop" kepada "parent => parent.obj.Prop"Dalam usaha untuk mengubah suai jenis ungkapan Linq sedia ada..."/> obj.Prop" kepada "parent => parent.obj.Prop"Dalam usaha untuk mengubah suai jenis ungkapan Linq sedia ada...">

Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengolah Semula Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?

Bagaimana untuk Mengolah Semula Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?

Patricia Arquette
Patricia Arquetteasal
2025-01-18 07:07:09277semak imbas

How to Rework a LINQ Expression from obj.Prop" kepada "parent => parent.obj.Prop"? " /> Refactor "obj => obj.Prop" kepada "parent => parent.obj.Prop"?

Faktor semula ungkapan LINQ "obj => obj.Prop" menjadi "parent => parent.obj.Prop"

Apabila mengubah suai ungkapan LINQ jenis Expression<Func<object>> sedia ada untuk menerima kelas induk, cabaran timbul apabila ungkapan itu melibatkan sifat bersarang. Kaedah ExpressionFromField<TModel> sedia ada menghadapi masalah mengendalikan ungkapan seperti cust => cust.Address.State kerana ia tidak boleh mengakses objek perantaraan secara eksplisit (cust.Address dalam kes ini).

Penyelesaian terletak pada komposisi ekspresi, yang menggabungkan berbilang ungkapan menjadi satu. Berikut ialah kaedah langkah demi langkah:

1. Kaedah gabungan ungkapan

Tentukan kaedah statik bernama Compose<T, TIntermediate, TResult> yang menerima tiga perwakilan ungkapan:

<code class="language-csharp">public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>(
    this Expression<Func<T, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    // 用第二个表达式的参数替换第一个表达式的参数出现
    return Expression.Lambda<Func<T, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>

2. Penggantian ungkapan

Mencipta kelas bernama ReplaceVisitor yang berasal daripada ExpressionVisitor:

<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;

    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }

    public override Expression Visit(Expression ex)
    {
        if (ex == from)
            return to;
        else
            return base.Visit(ex);
    }
}</code>

Tambah kaedah sambungan Expression pada kelas Replace:

<code class="language-csharp">public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>

3. Gabungan aplikasi

Dengan kaedah gabungan dan penggantian tersedia, anda kini boleh membina ungkapan baharu:

<code class="language-csharp">// 选择属性的表达式:
Expression<Func<Customer, object>> propertySelector =
    cust => cust.Name;

// 从模型中选择对象的表达式
Expression<Func<Model, Customer>> modelSelector = model => model.Customer;

// 组合表达式
Expression<Func<Model, object>> magic = modelSelector.Compose(propertySelector);</code>

Dengan gabungan...

Respons yang disemak ini mengekalkan bahasa dan struktur asal, menyusun semula frasa dan ayat untuk mencapai parafrasa tanpa mengubah makna Imej kekal dalam format dan lokasi asalnya.

Atas ialah kandungan terperinci Bagaimana untuk Mengolah Semula Ungkapan LINQ daripada 'obj => obj.Prop' kepada 'parent => parent.obj.Prop'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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