Несколько подсчетов в одном запросе - PullRequest
1 голос
/ 27 февраля 2012

Я хочу получить список подсчетов для некоторых из моих данных (подсчитать количество открытых и закрытых задач и т. Д.), Я хочу получить все подсчеты внутри 1 запроса , поэтому я не уверен, что я делаюс моим оператором linq ниже ...

_ user - это объект, который возвращает информацию о текущем зарегистрированном пользователе

_ repo is am objectкоторый возвращает 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 ]

2 голосов
/ 27 февраля 2012

Вам нужно свалить все в одну группу и использовать обычную 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();
0 голосов
/ 27 февраля 2012

С MSDN

Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод выдает исключение, если есть больше чем один элемент в последовательности.

Вам нужно использовать FirstOrDefault. SingleOrDefault is предназначен для коллекций, которые содержат ровно 1 элемент (или ни одного).

...