> 백엔드 개발 > C++ > 중첩된 개체 액세스를 위해 'obj => obj.Prop'와 같은 LINQ 식을 'parent => parent.obj.Prop'로 변환하는 방법은 무엇입니까?

중첩된 개체 액세스를 위해 'obj => obj.Prop'와 같은 LINQ 식을 'parent => parent.obj.Prop'로 변환하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-18 07:12:08
원래의
518명이 탐색했습니다.

중첩된 객체 액세스를 위해

How to Convert a LINQ Expression like obj.Prop"를 "parent => parent.obj.Prop"로 바꾸시겠습니까? " />

LINQ 식 "obj => obj.Prop"를 "parent => parent.obj.Prop"으로 변환: 단계별 가이드

LINQ 식은 개체의 속성에 액세스하는 강력한 방법을 제공합니다. 그러나 중첩된 개체의 속성에 액세스하는 등 계층 구조의 여러 수준을 탐색해야 하는 경우도 있습니다.

다음 LINQ 표현식을 고려하세요.

<code class="language-c#">cust => cust.Name</code>
로그인 후 복사

이 표현식은 고객 개체의 Name 속성을 검색합니다. 그러나 CustomerModel에 있는 Customer 개체의 Name 속성에 액세스해야 한다면 어떻게 될까요? 원래의 표현이 부족한 것 같습니다.

이 문제를 해결하려면 원래 표현식을 받아들이고 상위 클래스를 입력 매개변수로 사용하여 새 표현식을 생성하는 메서드가 필요합니다. 이 새로운 표현식은 MVC 메서드의 매개 변수가 되어 중첩된 속성에 효율적으로 액세스할 수 있습니다.

최초 릴리스 및 버그

한 가지 가능한 접근 방식은 다음과 같습니다.

<code class="language-c#">public Expression<Func<object>> ExpressionFromField<T, TModel>(FieldDefinition<T> field)
    where TModel : BaseModel<T>
{
    var param = Expression.Parameter(typeof(TModel), "t");
    var body = Expression.PropertyOrField(param, nameof(SelectedItem));
    var member = Expression.MakeMemberAccess(body, field.Member);
    return Expression.Lambda<Func<object>>(member, param);
}</code>
로그인 후 복사

그러나 이 버전은 중첩된 속성(예: cust.Address.State)에 액세스할 때 실패합니다. 발생한 오류는 지정된 멤버가 본문에 존재하지 않으며 본문이 주소 개체가 아닌 고객 개체를 참조함을 나타냅니다.

해결책: 표현 조합

필요한 해결책은 표현 구성에 있습니다. 함수를 구성할 수 있는 것처럼 표현식도 구성할 수 있습니다.

<code class="language-c#">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>
로그인 후 복사

Replace 메소드를 사용하여 한 표현식의 모든 인스턴스를 다른 표현식으로 바꿉니다. 이러한 방법을 사용하면 다음과 같은 표현식을 구성할 수 있습니다.

<code class="language-c#">Expression<Func<object>> propertySelector = cust => cust.Name;
Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer;
Expression<Func<CustomerModel, object>> magic = modelSelector.Compose(propertySelector);</code>
로그인 후 복사

이제 마법 표현식을 통해 CustomerModel에 있는 Customer 개체의 Name 속성에 효과적으로 액세스할 수 있습니다. MVC 메소드의 표현식 매개변수로 사용되어 중첩된 속성에 대한 원활한 액세스를 제공할 수 있습니다.

위 내용은 중첩된 개체 액세스를 위해 'obj => obj.Prop'와 같은 LINQ 식을 'parent => parent.obj.Prop'로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿