2010-04-20 4 views
3

Contexte: ASP.NET MVC 2.0, C#, SQL Server 2008, IIS7Un bon (élégant) façon de récupérer des enregistrements avec des comptes

Je table 'scheduledMeetings' dans la base de données. Il existe une relation un-à-plusieurs: scheduledMeeting -> meetingRegistration Pour que 10 personnes puissent s'inscrire à une réunion. meetingRegistration a les champs Nom et Sexe (par exemple).

J'ai sur mon site une "vue du calendrier" qui montre tous les événements à venir, ainsi que le nombre de personnes pour chaque événement.

Au moment où je l'utilise Linq à Sql pour tirer les données:

var meetings = db.Meetings.Select(
    m => new { 
     MeetingId = m.Id, 
     Girls = m.Registrations.Count(r => r.Gender == 0), 
     Boys = m.Registrations.Count(r=>r.Gender == 1) 
    }); 

(requête réelle est une demi-longue page) Parce qu'il ya une utilisation de type anonyme passe je ne peux pas l'extraire dans un méthode (puisque j'ai plusieurs différentes versions de l'affichage du calendrier, avec des informations différentes sur chacun, et je ne veux pas créer de nouvelle classe pour chacun).

Avez-vous des suggestions pour améliorer cela? L'affichage de la base de données est-il la solution? Ou devrais-je aller de l'avant et créer le type nommé?

Tous les commentaires/suggestions sont les bienvenus. Mon DataLayer est énorme, je veux le couper, je ne sais pas comment.

Les pointeurs pour une bonne lecture seraient bien aussi.

Répondre

1

Je transmets votre Meetings classe en ajoutant 2 propriétés:

public partial class Meeting 
{ 
    #region Properties 
    public int BoyCount { get; set; } 

    public int GirlCount { get; set; } 
    #endregion 
} 

Avec chargement différé:

var items = db.Meetings.Select(
    m => new { 
     Meeting = m, 
     Girls = m.Registrations.Count(r => r.Gender == 0), 
     Boys = m.Registrations.Count(r = >r.Gender == 1) 
    }).ToList(); 

items.ForEach(i => 
{ 
    i.Meeting.BoyCount = i.Boys; 
    i.Meeting.GirlCount = i.Girl; 
}); 

List<Meeting> = items 
    .Select(i => i.Meeting) 
    .ToList(); 

Avec chargement désireux, une des solutions consiste à charger Registrations avec votre entité Meeting :

DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<Meeting>(m = > m.Registrations); 
db.LoadOptions = loadOptions; 

Dans ce cas, les propriétés de classe partielle ci-dessus sont devenues des getters:

public partial class Meeting 
{ 
    #region Properties 
    public int BoyCount 
    { 
     get 
     { 
      return this.Registrations 
       .Count(r => r.Gender == 1); 
     } 
    } 

    public int GirlCount 
    { 
     get 
     { 
      return this.Registrations 
       .Count(r = > r.Gender == 0); 
     } 
    } 
    #endregion 
} 
Questions connexes