기본 유형이 이 아니며이 분명 함 Name
회원입니다. 이것이 어떻게 작동하는지 알 수 없습니다.
문제가 simpy 인 경우 런타임시 주문할 열만 알면됩니다. 동적 속성으로 주문하려면 즉시 Expression
을 작성해야합니다. 다음은이 작업을 수행하는 일부 오래된 코드입니다. "Name"과 "Customer.Name"(자식 속성)과 같은 것을 지원해야합니다. 그래도 최근에 그것을 테스트하지 않은 :
public static class OrderExtensions {
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "OrderBy");
}
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "OrderByDescending");
}
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "ThenBy");
}
public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)
{
return ApplyOrder<T>(source, property, "ThenByDescending");
}
static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) {
ParameterExpression arg = Expression.Parameter(typeof(T), "x");
Expression expr = arg;
foreach(string prop in property.Split('.')) {
// use reflection (not ComponentModel) to mirror LINQ
expr = Expression.PropertyOrField(expr, prop);
}
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), expr.Type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
return (IOrderedQueryable<T>) typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length ==2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), expr.Type)
.Invoke(null, new object[] {source, lambda});
}
}
테이블에 이름 열이있는 경우 왜 t.Name이 없습니까? – Blorgbeard
의 공용 클래스는 T RepositoryBase하는 기본 클래스 : 클래스, Interfaces.IModel 이 인터페이스는 모든 테이블이 그 –