我正在處理的Web應用程序的一部分是顯示從管理到1 ... n個用戶的消息的區域。我有一個包含LINQ to SQL類的DataAccess項目和一個用戶界面的網站項目。我的數據庫看起來是這樣的:最佳實踐:LINQ to SQL用於數據訪問
用戶 - > MessageDetail < - 消息< - MessageCategory
MessageDetail是一個連接表還包含IsRead標誌。
消息列表按類別分組。我在頁面上有兩個嵌套的ListView控件 - 一個輸出組名,而另一個嵌套在裏面,它綁定到MessageDetails並輸出消息本身。在後臺代碼上市,我有以下的代碼信息的頁面:
protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
var db = new DataContext();
// parse the input strings from the web form
int categoryIDFilter;
DateTime dateFilter;
string catFilterString = MessagesCategoryFilter.SelectedValue;
string dateFilterString = MessagesDateFilter.SelectedValue;
// TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"):
// DateTime.MinValue for dates, 0 for int
DateTime.TryParse(dateFilterString, out dateFilter);
Int32.TryParse(catFilterString, out categoryIDFilter);
bool showRead = MessagesReadFilter.Checked;
var messages =
from detail in db.MessageDetails
where detail.UserID == (int)Session["UserID"]
where detail.Message.IsPublished
where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0)
where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue)
// is unread, showRead filter is on, or message was marked read today
where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today
orderby detail.Message.PublishDate descending
group detail by detail.Message.MessageCategory into categories
orderby categories.Key.Name
select new
{
MessageCategory = categories.Key,
MessageDetails = categories.Select(d => d)
};
e.Result = messages;
}
此代碼工作,但在堅持了巨大的LINQ聲明這樣的代碼隱藏LinqDataSource控件只是沒有按」不要坐在我身邊。
看來我仍然在將查詢編碼到用戶界面中,現在只是LINQ而不是SQL。但是,我認爲在L2S類和用戶界面之間建立另一層會減少LINQ的一些靈活性。是不是要減少您爲獲取數據而編寫的代碼量?
有沒有可能的中間地帶我沒有看到,或者我只是誤解LINQ to SQL的方式應該被使用?建議將不勝感激。
這幾乎是我最終使用的方法。有用的建議,謝謝。 – 2008-10-03 03:43:13