객체에서 직접 속성을 선택하는 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 메서드 매개 변수를 비롯한 다양한 시나리오에 적합합니다.
obj.Prop"를 "parent => parent.obj.Prop"로 바꾸시겠습니까? " />
위 내용은 LINQ 식을 'obj => obj.Prop'에서 'parent => parent.obj.Prop'로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!