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>
拡張メソッド 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>
組み合わせにより...
この改訂された回答では、元の言語と構造が維持され、意味を変えることなくフレーズや文章が言い換えられます。
以上がLINQ 式を「obj => obj.Prop」から「parent =>parent.obj.Prop」に作り直すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。