場合によっては、オブジェクトからプロパティを直接選択する LINQ 式を、親オブジェクトを通じてプロパティを選択する式に変換する必要があります。たとえば、「cust => cust.Name」のような式は、「parent =>parent.Customer.Name」に変換する必要があります。
これには、式合成の概念を使用できます。これには、2 つの式を引数として受け入れる関数の作成が含まれます。1 つはプロパティを選択する式、もう 1 つはそのプロパティを含むオブジェクトを選択する式です。次のコード例は、このメソッドを使用した解決策を示しています。
<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>
<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>
obj.Prop" を "parent =>parent.obj.Prop" にしますか? " />
以上がLINQ 式を「obj => obj.Prop」から「parent =>parent.obj.Prop」に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。