문자열 열 정렬에 일반 매개변수를 사용하도록 OrderBy 확장
일반 확장 방법에서 문자열 열 이름을 사용하여 IQueryable을 정렬하는 방법은 무엇입니까? 기존 방법 ApplySortFilter<T, TResult>
에는 런타임에 OrderBy 유형을 지정해야 한다는 단점이 있는데 이는 불가능합니다.
질문:
<code class="language-c#">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName) where T : EntityObject { var param = Expression.Parameter(typeof(T), "o"); var body = Expression.PropertyOrField(param, columnName); var sortExpression = Expression.Lambda(body, param); return query.OrderBy(sortExpression); }</code>
해결책:
이러한 한계를 극복하려면 sortExpression
에서 OrderBy 유형을 추론해야 합니다. 수정된 구현은 다음과 같습니다.
<code class="language-c#">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>
이 수정된 메서드는 주문되는 속성의 유형을 동적으로 추론하고 OrderBy 작업을 올바르게 적용합니다.
내림차순 정렬 지침:
내림차순 정렬의 경우 MethodCallExpression
에서 "OrderBy"를 "OrderByDescending"으로 바꾸면 됩니다.
위 내용은 IQueryable의 OrderBy를 사용하여 일반 문자열 열 정렬을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!