>백엔드 개발 >C++ >일반 확장 메서드에서 문자열 열 이름을 사용하여 IQueryable을 동적으로 주문하는 방법은 무엇입니까?

일반 확장 메서드에서 문자열 열 이름을 사용하여 IQueryable을 동적으로 주문하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-14 07:17:42317검색

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

문자열 열 이름을 사용하는 일반 확장 메서드에서

IQueryable에 OrderBy 적용

일반 확장 메서드에서 문자열 열 이름을 사용하여 IQueryable에 OrderBy를 적용하려고 할 때 문제가 발생했습니다. OrderBy 유형은 sortExpression에서 유추할 수 없으며 런타임에 명시적으로 지정해야 합니다.

한 가지 방법은 sortExpression을 지정된 유형의 람다 표현식으로 정의하는 것입니다.

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>

그러나 이 접근 방식은 컴파일 타임에 TSortColumn 유형을 알아야 하는데, 이것이 항상 가능한 것은 아닙니다.

이러한 제한을 극복하기 위해 LINQ to SQL 프로젝트에 사용된 것과 유사한 기술을 활용할 수 있습니다. 수정된 코드 조각은 다음과 같습니다.

<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

이 방법을 사용하면 문자열 순서 매개변수를 사용하여 정렬할 속성을 동적으로 지정할 수 있습니다. 내림차순 정렬의 경우 MethodCallExpression에서 "OrderBy" 대신 "OrderByDescending"을 사용하면 됩니다.

이 개선된 버전은 더 간결한 설명을 제공하고 코드는 기능적으로 동일하게 유지됩니다.

위 내용은 일반 확장 메서드에서 문자열 열 이름을 사용하여 IQueryable을 동적으로 주문하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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