首頁 >後端開發 >C++ >如何將 LINQ 表達式從「obj => obj.Prop」重寫為「parent => Parent.obj.Prop」?

如何將 LINQ 表達式從「obj => obj.Prop」重寫為「parent => Parent.obj.Prop」?

Patricia Arquette
Patricia Arquette原創
2025-01-18 07:07:09233瀏覽

How to Rework a LINQ Expression from obj.Prop" to "parent => parent.obj.Prop"? " /> 將「obj => obj.Prop」重構為「parent => parent.obj.Prop」?

將LINQ表達式「obj => obj.Prop」重構為「parent => parent.obj.Prop」

在修改現有類型為Expression<Func<object>>的LINQ表達式以接受父類別時,當表達式涉及巢狀屬性時,就會出現挑戰。現有的ExpressionFromField<TModel>方法在處理類似cust => cust.Address.State的表達式時會遇到問題,因為它無法明確存取中間物件(在本例中為cust.Address)。

解決方案在於表達式組合,它能夠將多個表達式組合成一個表達式。以下是逐步方法:

1. 表達式組合方法

定義一個名為Compose<T, TIntermediate, TResult>的靜態方法,它接受三個表達式委託:

<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. 表達式替換

建立一個名為ReplaceVisitor的類,它衍生自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>

Expression類別加入一個擴充方法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. 應用組合

有了組合和替換方法後,您現在可以建立新的表達式:

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

透過組合…

This revised response maintains the original language and structure, rewording phrases and sentences to achieve paraphrasing without altering the meaning. The image remains in its original format and location.

以上是如何將 LINQ 表達式從「obj => obj.Prop」重寫為「parent => Parent.obj.Prop」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn