c# - 通用 LINQ orderby lambda 函数

标签 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 和其他值类型字段(以及 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

最佳答案

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

此时去掉“String”类型就可以继续,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)

关于c# - 通用 LINQ orderby lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487477/

相关文章:

c# - 使用 ModelState MVC 进行验证

c# - Prism中的共享接口(interface)应该放在哪里?

c# - Linq 中嵌套选择的替代方法

c# - 无法从查询返回 linq 结果

linq-to-sql - 使用 LINQ2SQL 或 Entity Framework 时,是否为大型数据库创建多个 .dbml/.edmx 文件?

c# - 如果不为空则添加到集合

c# - 屏幕抓取应用程序窗口并与鼠标和键盘交互

c# - 将标志拆分为规范化表

c# - 从 self 跟踪实体迁移到 DBContext

asp.net - 使用 Web API 和数据库优先策略构建 ASP.Net 应用程序