2010-04-20 40 views
3

情景记录:ASP.NET MVC 2.0,C#,SQL Server 2008中,IIS7良好(优雅的)的方式来检索与数

我在数据库 'scheduledMeetings' 表。 有一个一对多的关系:scheduledMeeting - > meetingRegistration 这样你就可以有10人注册参加一个会议。 meetingRegistration具有字段名称和性别(例如)。

我在我的网站上有一个“日历视图”,显示所有即将发生的事件以及每个事件的性别计数。

目前我使用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是巨大的,我想修剪它,只是不知道如何。

良好的阅读指针也会很好。

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

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

随着延迟加载:

回答

1

我加入2个属性来扩展你的Meetings

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

用预先加载的解决方案之一是加载RegistrationsMeeting实体:

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 
}