obj.Prop"를 "parent => parent.obj.Prop"으로 재작업하는 중 기존 Linq 표현식 유형을 수정하는 과정에서..."/> obj.Prop"를 "parent => parent.obj.Prop"으로 재작업하는 중 기존 Linq 표현식 유형을 수정하는 과정에서...">

>백엔드 개발 >C++ >'obj => obj.Prop'에서 'parent => parent.obj.Prop'로 LINQ 식을 재작업하는 방법은 무엇입니까?

'obj => obj.Prop'에서 'parent => parent.obj.Prop'로 LINQ 식을 재작업하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-18 07:07:09233검색

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. 표현조합 방법

세 개의 표현식 대리자를 허용하는 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>

조합으로...

이 수정된 응답은 원래의 언어와 구조를 유지하고, 의미를 변경하지 않고 다른 말로 표현하기 위해 문구와 문장을 바꾸었습니다.

위 내용은 'obj => obj.Prop'에서 'parent => parent.obj.Prop'로 LINQ 식을 재작업하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.