一种很好的(优雅的)方法来检索带有计数的记录

时间:2010-04-20 18:16:25

标签: linq-to-sql data-access-layer data-access

上下文:ASP.NET MVC 2.0,C#,SQL Server 2008,IIS7

我在数据库中有'scheduledMeetings'表。 存在一对多的关系:scheduledMeeting - > meetingRegistration 这样你就可以有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 个答案:

答案 0 :(得分:1)

我会通过添加2个属性扩展您的Meetings类:

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;

在这种情况下,上面的部分类属性变成了getter:

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
}