2010-12-02 6 views
4

Je voulais faire une table de style de pagination, mais l'exemple NeerDinner récupère toutes les données dans un type PaggingList, et j'ai plus de 10 000 lignes à extraire, donc j'ai sauté cette partie.Comment faire un simple compte dans Linq?

Je viens donc 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 partie Take?

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 qui fera la requête une fois de plus ...

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

+0

double possible de [LINQ: Paging tecnique, en utilisant prendre et sauter, mais besoin total des dossiers aussi - comment mettre en œuvre cette ?] (http://stackoverflow.com/questions/4275935/linq-paging-tecnique-using-take-and-skip-but-need-total-records-also-how-to-i) – Singleton

+0

@Hansmukh I ' Je ne demande pas comment faire pagination ... Je demande comment 'Count' :) – balexandre

+0

Qu'en est-il de la réponse sur cette page? Linq Paging - Comment incorporer le nombre total d'enregistrements http://stackoverflow.com/questions/2553167/linq-paging-how-to-incorporate-total-record-count – Chris

Répondre

13

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

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

... LINQ to SQL sera assez intelligent pour faire une requête SELECT COUNT, qui est potentiellement assez efficace (efficacité dépendra plus des conditions la requête). Bottom line est que l'opération de comptage se passe dans la base de données, pas dans le code LINQ.

+0

ahhh, il me manquait la partie "assez intelligent" :) – balexandre

0

Écrire mes anciens commentaires: Eh bien, j'étais confronté au même problème il y a quelque temps et puis je suis venu avec LINQ à SP =). Faites un SP et déposez-le dans vos entités et utilisez-le. Vous pouvez écrire SP en fonction de votre besoin, comme tirer la colonne d'enregistrement total aussi. Il est plus facile et rapide que de comparer à ce que vous utilisez wright maintenant.

0

Vous pouvez mettre le nombre pour la logique de requête, ainsi que, 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); 
     }