单个查询中的多个计数

时间:2012-02-27 14:50:52

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

我想要一些我的数据计数列表(计算open.closed任务的数量等),我想得到 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();

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

注意:我想要整体统计数据,不是针对每项任务,而是针对所有任务 - 不确定如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

您需要将所有内容转储到一个组中,并使用常规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 :(得分:0)

来自MSDN

  

返回序列的唯一元素,如果是,则返回默认值   序列是空的;如果有更多,此方法会抛出异常   比序列中的一个元素。

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