Comment faire un simple compte à Linq?

ado.net entity-framework linq linq-to-entities

Question

Je voulais créer une table de style de pagination, mais l'exemple NeerDinner récupère l'intégralité des données dans un type PaggingList , et j'ai plus de 10 000 lignes à récupérer, j'ai donc ignoré cette partie.

donc je viens avec cette requête

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);

Le problème est, comment puis - je obtenir le nombre total de résultats avant la Take part?

Je pensais à:

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();

mais cela fera la requête encore une fois ...

Quelqu'un a des suggestions sur comment puis-je le faire efficacement ?

Réponse acceptée

Si vous prenez une requête en tant que telle:

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

... LINQ to SQL sera suffisamment intelligent pour en faire une requête SELECT COUNT , potentiellement assez efficace (l'efficacité dépendra davantage des conditions de la requête). En bout de ligne, l'opération de comptage se produit dans la base de données, pas dans le code LINQ.


Réponse populaire

Vous pouvez aussi compter pour la logique de requête, voir l'exemple ci-dessous:

 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);
        }


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow