21 Kasım 2008, Cuma
Nasıl bir IQueryable genel uzantısı bir yöntem içinde dize bir sütun adını kullanarak OrderBy başvurabilirim?
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);
}
OrderBy türünü belirtmek istiyorum sortExpression algılanır bir şey değil çünkü zamanında bu gibi:
var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Ya
return query.OrderBy<T, TSortColumn>(sortExpression);
Bu TSortColumn sadece çalışma sırasında tespit edilebilir ancak mümkün olduğunu sanmıyorum.
Bu etrafında bir yolu var mı?
CEVAP
21 Kasım 2008, Cuma
Proje SQL için bir SERİ benzer bir şey (100% aynı, ama benzer değil) yaptık. İşte kod:
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);
}
Aslında genel kullanmadık, bilinen bir sınıf vardı, ama bir genel (olması gereken yerde genel tutucu koydum) üzerinde çalışması gerekir.
Düzenleme:Azalan için OrderByDescending
pass "yerine": . OrderBy
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
Bunu Paylaş:
C# nasıl bir yöntem içinde geçti genel...
Nasıl bir dize olarak adını aldığımda ...
Nasıl bir dize içinde bir dize tekrarı...
Nasıl bir dize olarak yöntem adı veril...
Nasıl bir metin dosyası Java kullanara...