2010-04-20 79 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 
} 
相關問題