2010-04-20 2 views
3

Контекст: ASP.NET MVC 2.0, C#, SQL Server 2008, IIS7Хороший (элегантный) способ получения записей с подсчетов

У меня есть таблица 'scheduledMeetings' в базе данных. Существует соотношение «один ко многим»: запланированоMeeting -> meetingRegistration Чтобы вы могли зарегистрировать 10 человек для встречи. meetingРегистрация имеет поля Имя и Пол (например).

У меня есть «вид календаря» на моем сайте, который показывает все ближайшие события, а также гендерный счет для каждого события.

На данный момент я использую Linq к Sql, чтобы вытащить данные:

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

(фактический запрос на пол-страницы длинной) Поскольку анонимный тип использования происходит я не могу извлечь его в метод (так как у меня есть несколько разных вариантов представления календаря, с каждой информацией по каждой из них, и я не хочу создавать для каждого класса новый класс).

Любые предложения по улучшению этого? Является ли представление базы данных ответом? Или мне нужно продолжить и создать именованный тип?

Любые отзывы/предложения приветствуются. Мой DataLayer огромен, я хочу его обрезать, просто не знаю, как это сделать.

Указатели на хорошее чтение тоже будут хороши.

ответ

1

Я бы расширить Meetings класс, добавив 2 свойство:

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

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

С отложенной загрузкой:

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

С жадной нагрузкой, один из решений заключаются в загрузке Registrations с Meeting лица :

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

В этом случае свойства частичного класса выше были получены:

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 
} 
Смежные вопросы