2008-09-06 59 views
6

我正在處理的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的方式應該被使用?建議將不勝感激。

回答

5

您的所有LINQ查詢應該位於業務邏輯類,與ADO等舊方法沒有任何變化。

如果你是純粹主義者你應該總是從業務類中的方法中返回List(T),事實上,datacontext應該只對業務類可見。 然後你可以在用戶界面中操作列表。

如果您是實用主義者,您可以返回一個IQueryable對象並在用戶界面中進行一些操作。

+0

這幾乎是我最終使用的方法。有用的建議,謝謝。 – 2008-10-03 03:43:13

1

無論LINQ如何,我認爲混合表示代碼和數據庫相關代碼並不是一個好主意。我將在LINQ查詢之上創建一個簡單的數據庫抽象層。在我看來,LINQ只是一個方便的工具,對傳統的應用程序設計沒有嚴重的影響。