>백엔드 개발 >C++ >문자열 열 이름을 사용하여 IQueryable에서 동적 정렬을 위한 일반 확장 방법을 구현하는 방법은 무엇입니까?

문자열 열 이름을 사용하여 IQueryable에서 동적 정렬을 위한 일반 확장 방법을 구현하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-14 09:45:43876검색

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

문자열 열 이름을 사용하여 IQueryable을 동적으로 정렬하는 일반 확장 방법

이 기사에서는 문자열 열 이름을 사용하여 ApplySortFilter 컬렉션을 동적으로 정렬할 수 있는 일반 확장 메서드 IQueryable를 구현하는 방법을 살펴봅니다. 핵심 문제는 런타임에 OrderBy 메서드에 올바른 유형을 지정하는 방법입니다.

첫 시도

원래 구현에서는 sortExpression에서 OrderBy 표현식의 유형을 다음과 같이 추론하려고 시도합니다.

<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;

    // 确定排序方向
    if (ordering.StartsWith("-"))
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }
    else
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }

    // 创建并返回查询
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

사용방법

이 방법을 사용하려면 정렬할 열 이름을 문자열로 지정합니다.

<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>

이름 열을 기준으로 오름차순으로 정렬된 쿼리가 생성됩니다.

이 개정된 출력은 코드와 그 목적에 대한 더 간결하고 기술적으로 정확한 설명을 제공하는 동시에 가독성을 위해 형식도 개선되었습니다.

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

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