SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006