2008-09-06 37 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只是一个方便的工具,对传统的应用程序设计没有严重的影响。