ホームページ > バックエンド開発 > C++ > LINQ 式を「obj => obj.Prop」から「parent =>parent.obj.Prop」に作り直すにはどうすればよいですか?

LINQ 式を「obj => obj.Prop」から「parent =>parent.obj.Prop」に作り直すにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-18 07:07:09
オリジナル
239 人が閲覧しました

How to Rework a LINQ Expression from obj.Prop" を "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 つに結合する式の合成にあります。段階的な方法は次のとおりです:

1. 式の組み合わせ方法

3 つの式デリゲートを受け入れる 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>
ログイン後にコピー

拡張メソッド ExpressionReplace クラスに追加します:

<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>
ログイン後にコピー

組み合わせにより...

この改訂された回答では、元の言語と構造が維持され、意味を変えることなくフレーズや文章が言い換えられます。

以上がLINQ 式を「obj => obj.Prop」から「parent =>parent.obj.Prop」に作り直すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート