【问题标题】:Multiple Counts within a single query单个查询中的多个计数
【发布时间】:2012-02-28 22:39:35
【问题描述】:

我想要我的一些数据的计数列表(计算 open.close 任务的数量等),我想在 1 查询中获取所有计数,所以我不确定我的用我下面的 linq 语句做...

_user 是一个返回当前登录用户信息的对象

_repo 是一个对象,它返回我要选择的任何表的 IQueryable

       var counters = (from task in _repo.All<InstructionTask>()
                        where task.AssignedToCompanyID == _user.CompanyID || task.CompanyID == _user.CompanyID
                        join instructions in _repo.GetAllMyInstructions(_user) on task.InstructionID equals
                            instructions.InstructionID
                        group new {task, instructions}
                            by new
                                   {
                                       task
                                   }
                        into g
                        select new
                                   {
                                       TotalEveryone = g.Count(),
                                       TotalMine = g.Count(),
                                       TotalOpen = g.Count(x => x.task.IsOpen),
                                       TotalClosed = g.Count(c => !c.task.IsOpen)
                                   }).SingleOrDefault();

我是否将我的对象转换为单个对象或默认对象?我得到的例外是,这个序列包含多个元素

注意:我想要整体统计数据,不是针对每个任务,而是针对所有任务 - 不知道如何获得?

【问题讨论】:

  • 您的摸索将为每个任务产生一个组,那么您为什么要分组呢?
  • @RuneFS - 我如何将其重写为不分组以获得我想要的?
  • 我不知道你想按任务分组什么,最后你的单身让我感到困惑。我不明白为什么您首先要分组,并且查询看起来大多数时候会产生多个结果,当您使用 SingleOrDefault 时会抛出。编写一些示例输入和预期输出,这可能会有所帮助

标签: linq linq-to-sql c#-3.0


【解决方案1】:

您需要将所有内容转储到一个组中,并使用常规Single。我不确定 LINQ-to-SQL 是否能够正确翻译它,但绝对值得一试。

var counters = (from task in _repo.All<InstructionTask>()
    where task.AssignedToCompanyID == _user.CompanyID || task.CompanyID == _user.CompanyID
    join instructions in _repo.GetAllMyInstructions(_user) on task.InstructionID == instructions.InstructionID
    group task by 1 /* <<=== All tasks go into one group */ into g select new {
        TotalEveryone = task.Count(),
        TotalMine = task.Count(), // <<=== You probably need a condition here
        TotalOpen = task.Count(x => x.task.IsOpen),
        TotalClosed = task.Count(c => !c.task.IsOpen)

    }).Single();

【讨论】:

  • 我不想要每个任务的计数,我想要整体统计数据,抱歉我的小组陈述也可能是错误的,你能建议吗?
  • 这看起来可行,但需要对其进行测试并尝试理解您的代码,之前从未见过 1 组任务???
  • @Haroon 这是我从an earlier answer 学到的一个小技巧。 1 在这里不是必需的 - 你可以用任何数字替换它;只需将所有记录放入一个组中即可。
【解决方案2】:

来自MSDN

返回序列的唯一元素,如果 序列为空;如果还有更多,此方法将引发异常 序列中的一个元素以上。

您需要使用FirstOrDefaultSingleOrDefault is 专为仅包含 1 个元素(或没有)的集合而设计。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2010-11-19
    • 2011-09-19
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多