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

如何將 LINQ 表達式從「obj => obj.Prop」轉換為「parent =>parent.obj.Prop」?

Patricia Arquette
發布: 2025-01-18 07:17:09
原創
490 人瀏覽過

將LINQ表達式「obj => obj.Prop」轉換為「parent => parent.obj.Prop」

在某些情況下,需要將直接從物件選擇屬性的LINQ表達式轉換為透過父物件選擇屬性的表達式。例如,需要將類似「cust => cust.Name」的表達式轉換為「parent => parent.Customer.Name」。

為此,可以使用表達式組合的概念。這涉及創建一個函數,該函數接受兩個表達式作為參數:一個選擇屬性,另一個選擇包含該屬性的物件。以下程式碼範例提供了使用此方法的解決方案:

<code class="language-csharp">public static Expression<Func<TFirst, TResult>> Compose<TFirst, TIntermediate, TResult>(
    this Expression<Func<TFirst, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TFirst, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>
登入後複製

此外,還需要一個名為「Replace」的輔助方法來取代一個表達式的所有出現:

<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);
    }
}

public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>
登入後複製

使用這些輔助方法,現在可以像這樣組合表達式:

<code class="language-csharp">// 从对象中选择一个属性
Expression<Func<Customer, string>> propertySelector = cust => cust.Name;

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

// 组合两个表达式
Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
登入後複製

這種方法為組合表達式以存取巢狀屬性提供了一種靈活的解決方案,使其適用於各種場景,包括MVC方法參數。

How to Convert a LINQ Expression from obj.Prop" to "parent => parent.obj.Prop"? " />

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板