【问题标题】:Multiple Grouping with IQueryable and returning a list of objects in C# linq query使用 IQueryable 进行多个分组并在 C# linq 查询中返回对象列表
【发布时间】:2018-06-13 21:31:34
【问题描述】:

我有一张桌子ot_request,就像这个链接一样。我必须返回具有以下条件的ot_request 实体类列表。

  1. 我必须过滤status_id==5 所在的列表
  2. 过滤后,我必须将行按project_id 分组
  3. 经过project_id分组后,会有一些creator_id具有相同的值。所以在project_id 分组中,我必须再次按它们的creator_id 对这些项目进行分组,并将worktime_hours 归于它们。

我尝试了以下 Linq 查询: (上下文是数据库实体的对象)

IQueryable<ot_request> filterList = context.ot_request
                                  .Where(o => o.status_id == 5)
                                  .GroupBy(o => o.project_id)
                                  .Select(o => new { Project = o.Key, 
                                          Total = o.Sum(v=>v.worktime_hours))})
                                  .OrderByDescending(o => o.Total);

但它向我显示了错误消息:

错误 1 ​​无法隐式转换类型 'System.Linq.IOrderedQueryable&lt;AnonymousType#1&gt;''System.Linq.IQueryable&lt;Project.DataEntity.ot_request&gt;'。 存在显式转换(您是否缺少演员表?)

谁能帮我解决这个问题?

【问题讨论】:

  • 在您的 Select 中,您正在创建一个新的匿名类型。这就是为什么它说System.Linq.IOrderedQueryable&lt;AnonymousType#1&gt;
  • 问问自己:您要订购什么?他们是 ot_requests 吗?或者它们是不同的东西,与 Project 和 Total 有什么不同?因此,如果您订购此输入,您期望输出是什么?这可以转换为 ot_requests 吗?

标签: c# entity-framework linq


【解决方案1】:

我建议改变:

.OrderByDescending(o => o.Total);

到:

.OrderByDescending(o => o.Total).Select(z => z.Project);

您当前通过现有的Select 调用返回匿名类型设置,而不是您感兴趣的特定类型。

或者,如果您对Total 特别感兴趣,请更改:

IQueryable<ot_request> filterList 

到:

var filterList 

这将确保filterList 是您的新匿名类型的IQueryable(包括Total)。

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多