6

我正在处理的 Web 应用程序的一部分是一个显示从管理层到 1...n 个用户的消息的区域。我有一个包含 LINQ to SQL 类的 DataAccess 项目,以及一个作为 UI 的网站项目。我的数据库如下所示:

用户 -> 消息详细信息 <- 消息 <- 消息类别

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;
}

这段代码有效,但是在 LinqDataSource 控件的代码隐藏中粘贴这样一个巨大的 LINQ 语句并不适合我。

似乎我仍在将查询编码到用户界面中,只是现在它是 LINQ 而不是 SQL。但是,我觉得在 L2S 类和 UI 之间构建另一个层会削弱 LINQ 的一些灵活性。减少您为获取数据而编写的代码量不是重点吗?

是否有一些我没有看到的中间立场,或者我只是误解了应该使用 LINQ to SQL 的方式?建议将不胜感激。

4

2 回答 2

5

您的所有 LINQ 查询都应该在业务逻辑类中,与 ADO 等旧方法没有任何变化。

如果您是纯粹主义者,您应该始终从业务类中的方法返回 List(of T),事实上,数据上下文应该只对业务类可见。然后您可以在用户界面中操作列表。

如果您是一个实用主义者,您可以返回一个 IQueryable 对象并在用户界面中进行一些操作。

于 2008-09-24T22:46:45.073 回答
1

不管 LINQ 是什么,我认为将表示代码与数据库相关代码混合不是一个好主意。我会在 LINQ 查询之上创建一个简单的 DB 抽象层。在我看来,LINQ 只是一个方便的工具,它不会对传统的应用程序设计产生严重影响。

于 2008-09-06T11:09:38.903 回答