【问题标题】:Searching and Sorting IEumerable using LINQ使用 LINQ 搜索和排序 IEnumerable
【发布时间】:2015-01-09 14:56:49
【问题描述】:

我是 MVC 和 LINQ 的新手,我正在学习如何将 AngularJs 和 MVC 用于分配给我的新项目。所以我正在通过在线视频学习这些技术。导师使用代码优先的方法,所以 Visual Studio 创建了所有必要的文件和一个与导师模型匹配的数据库,另一方面,我已经有一个数据库,我创建了 Api 来对数据库执行 REST 操作。所以当我在下面运行这段代码时

        public IEnumerable<Todo> GetTodos()
    {

        return Models.DbStoredProcModel.GetAllTodos.GetAllTodoEntryStoredProcedure();
    }

它返回一个像这样的 Json 输出

所以到目前为止,我的 json 输出与视频教程匹配,即使我们的代码方法不同。所以导师,用他写的这段代码

导师代码:

    public IEnumerable<Todo> GetTodos(string q= null,string sort = null, bool desc = false, int ? limit = null, int offset =0)
    {
        var result = ((IObjectContextAdapter)db).ObjectContext.CreateObjectSet<Todo>();

        IQueryable<Todo> items = string.IsNullOrEmpty(sort)
            ? result.OrderBy(o => o.Priority)
            : result.OrderBy(String.Format("it. {0} {1}", sort, desc ? "DESC" : "ASC"));

        if (!string.IsNullOrEmpty(q) && q != "undefined")
            items = items.Where(t => t.Text.Contains(q));

        if (offset > 0) items = items.Skip(offset);
        if (limit.HasValue) items = items.Take(limit.Value);

        return items;
    } 

这将允许他对返回的数据执行搜索和排序操作。

现在这是我自己的代码,尝试编写相同的代码。

       public IEnumerable<Todo> GetTodos(string q= null,string sort = null, bool desc = false, int ? limit = null, int offset =0)
    {
        var result = Models.DbStoredProcModel.GetAllTodos.GetAllTodoEntryStoredProcedure( );

        IQueryable<Todo> items = string.IsNullOrEmpty(sort)
            ? result.OrderBy(o => o.Priority)
             // i get the error on the line below
            : result.OrderBy(String.Format("it. {0} {1}", sort, desc ? "DESC" : "ASC"));

        if (!string.IsNullOrEmpty(q) && q != "undefined")
            items = items.Where(t => t.Text.Contains(q));

        if (offset > 0) items = items.Skip(offset);
        if (limit.HasValue) items = items.Take(limit.Value);

        return items;

    }

但是,我收到一个错误提示

错误:无法从用法推断方法 'System.Linq.Enumerable.OrderBy&lt;TSource,TKey&gt;(System.Collections.Generic.IEnumerable&lt;TSource&gt;, System.Func&lt;TSource,TKey&gt;)' 的类型参数。尝试明确指定类型参数。

我该如何解决这个问题?

【问题讨论】:

标签: c# asp.net-mvc json angularjs linq


【解决方案1】:

改变

 result.OrderBy(String.Format("it. {0} {1}", sort, desc ? "DESC" : "ASC"))

 result.OrderBy<Todo,string>(String.Format("it. {0} {1}", sort, desc ? "DESC" : "ASC"))

以获得更清晰的错误消息。

潜在的问题可能是

result.OrderBy(String.Format("it. {0} {1}", sort, desc ? "DESC" : "ASC"))

在您的应用程序上下文中没有有意义的解释。对我来说,它看起来像动态 linq,需要引用替代 OrderBy 定义的引用,而不是您将引用的那些。

我的建议是检查本教程引用的命名空间(在项目引用中和此文件的顶部),以防您遗漏任何内容。

【讨论】:

  • 这不会改变任何事情。那行代码已经正确推断出泛型参数。
  • 哦,是的,我现在看到了,我会更新到有问题的那一行
  • 这仍然离问题的答案相去甚远。显然目的是不使用Enumerable.OrderBy 方法,因此真正的实现甚至不会有两个通用参数。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多