【问题标题】:Generic LINQ orderby lambda function通用 LINQ orderby lambda 函数
【发布时间】:2014-06-30 09:58:01
【问题描述】:

我想知道 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 不同。如何在我的版本中避免这种情况?

ps:Object 不是替代品,因为它不适用于 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

【问题讨论】:

  • 嗨,看看这个,可能对hookedonlinq.com/OrderByOperator.ashx有帮助
  • 抛出什么异常?
  • qry.MyOrderBy(p => p.Name );不应该工作,因为 MyOrderBy 需要 2 个 Type 参数。
  • James - EntityFramework.SqlServer.dll 中发生了“System.NotSupportedException”类型的未处理异常附加信息:无法将“System.Int32”类型转换为“System.Object”类型。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
  • “对象不是替代品,因为它不适用于 Int32 和其他值类型字段”为什么不呢?

标签: c# linq entity-framework lambda


【解决方案1】:

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

此时去掉“String”类型继续正确,Name属性(字符串)的类型是编译器识别的,不需要指定;

编辑:

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)

【讨论】:

  • @NicoSchertler 这是真的。 Reza 的回答有效。为什么不应该呢?
  • 在这种情况下要写什么语法以及如何调用它?
  • 感谢您的正确回答,它有效。我想知道为什么?! :) 什么编译器功能支持这种语法?它是否记录在某处?据我所知,这应该被称为qry.MyOrderBy&lt;String&gt;(p =&gt; p.Name )
  • @ZoltanHernyak,有关msdn.microsoft.com/en-us/library/twcad0zb.aspx 中的更多信息,请关注“类型推断”。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多