Как сделать простой подсчет в Linq? - PullRequest
5 голосов
/ 02 декабря 2010

Я хотел создать таблицу стилей подкачки, но пример NeerDinner извлекает все данные в тип PaggingList, и у меня более 10 000 строк для выборки, поэтому я пропустил эту часть.

поэтому я задаю этот запрос

var r = (from p in db.Prizes
            join c in db.Calendars on p.calendar_id equals c.calendar_id
            join ch in db.Challenges on c.calendar_id equals ch.calendar_id
            join ca in db.ChallengeAnswers on ch.challenge_id equals ca.challenge_id
            join cr in db.ChallengeResponses on ca.challenge_answer_id equals cr.challenge_answer_id

            where
                p.prize_id.Equals(prizeId)
                && ch.day >= p.from_day && ch.day <= p.to_day
                && ca.correct.Equals(true)
                && ch.day.Equals(day)

            orderby cr.Subscribers.name

            select new PossibleWinner()
            {
                Name = cr.Subscribers.name,
                Email = cr.Subscribers.email,
                SubscriberId = cr.subscriber_id,
                ChallengeDay = ch.day,
                Question = ch.question,
                Answer = ca.answer
            })
        .Skip(size * page)
        .Take(size);

Проблема в том, как я могу получить общее количество результатов до Take части?

Я думализ:

var t = (from p in db.JK_Prizes
            join c in db.JK_Calendars on p.calendar_id equals c.calendar_id
            join ch in db.JK_Challenges on c.calendar_id equals ch.calendar_id
            join ca in db.JK_ChallengeAnswers on ch.challenge_id equals ca.challenge_id
            join cr in db.JK_ChallengeResponses on ca.challenge_answer_id equals cr.challenge_answer_id

            where
                p.prize_id.Equals(prizeId)
                && ch.day >= p.from_day && ch.day <= p.to_day
                && ca.correct.Equals(true)
                && ch.day.Equals(day)

            select cr.subscriber_id)
        .Count();

но это будет делать запрос заново ...

у кого-нибудь есть предложения о том, как я могу сделать это эффективно ?

Ответы [ 3 ]

13 голосов
/ 02 декабря 2010

Если вы возьмете запрос таким образом:

var qry = (from x in y
           select x).Count();

... LINQ to SQL будет достаточно умным, чтобы сделать этот запрос SELECT COUNT, который потенциально довольно эффективен (эффективность будет зависеть большеусловия в запросе).Суть в том, что операция подсчета происходит в базе данных, а не в коде LINQ.

0 голосов
/ 19 марта 2011

Вы можете указать количество для логики запроса, а также, см. Пример ниже:

 public int GetTotalCountForAllEmployeesByReportsTo(int? reportsTo, string orderBy = default(string), int startRowIndex = default(int), int maximumRows = default(int))
        {
            //Validate Input
            if (reportsTo.IsEmpty())
                return GetTotalCountForAllEmployees(orderBy, startRowIndex, maximumRows);

            return _DatabaseContext.Employees.Count(employee => reportsTo == null ? employee.ReportsTo == null : employee.ReportsTo == reportsTo);
        }
0 голосов
/ 02 декабря 2010

Написание моих старых комментариев: Ну, я столкнулся с той же проблемой некоторое время назад, а затем я придумал LINQ to SP =). Сделайте SP и добавьте его в свои сущности и используйте его. Вы можете написать Sp в соответствии с вашими потребностями, например, потянув столбец итоговой записи. Это проще и быстрее по сравнению с тем, что вы используете сейчас.

...