通用LINQ orderby lambda函数

时间:2014-06-30 09:58:02

标签: c# linq entity-framework lambda

我想知道如何编写LINQ OrderBy?我试图重现:

IOrderedQueryable<T> MyOrderBy<T,TKey>(IQueryable<T> qry, Expression<Func<T,TKey> expr)
{
  return qry.OrderBy(expr);
}

可以称为:

MyOrderBy<Products,String>(qry, p=>p.Name);

将此重构为扩展方法为IQueryable,可以将其命名为:

qry.MyOrderBy<String>(p => p.Name );

与LINQ OrderBy不同,后者不需要String类型参数。如何在我的版本中避免这种情况?

ps:对象不是替代品,因为它不适用于Int32和其他Value类型字段(以及EF Linq):

IOrderedQueryable<T> MyOrderByObject<T>(IQueryable<T> qry, Expression<Func<T,Object> expr)
{
  return qry.OrderBy(expr);
}

将删除异常(如果ID是Int32字段):

qry.MyOrderByObject(p => p.ID ); // throws an exception

1 个答案:

答案 0 :(得分:2)

您可以在方法的泛型使用中删除冗余类型参数

在这种情况下,删除&#34; String&#34; type是继续的,Name属性(string)的类型由编译器识别,不需要指定它;

编辑:

public static class MyExtentions
{
    public static IOrderedQueryable<T> MyOrderBy<T, TKey>(this IQueryable<T> qry, Expression<Func<T, TKey>> expr)
    {
        return qry.OrderBy(expr);
    }
}

呼叫:

qry.MyOrderBy(p => p.Id)