Хороший (элегантный) способ получения записей с количеством - PullRequest
3 голосов
/ 20 апреля 2010

Контекст: ASP.NET MVC 2.0, C #, SQL Server 2008, IIS7

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

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

В данный момент я использую Linq to 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 Ответ

1 голос
/ 22 апреля 2010

Я бы расширил ваш класс 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
}
...