当前位置:  开发笔记 > 编程语言 > 正文

最佳实践:LINQ To SQL用于数据访问

如何解决《最佳实践:LINQToSQL用于数据访问》经验,为你挑选了1个好方法。

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

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

这段代码可以工作,但在LinqDataSource控件的代码隐藏中加入这样一个巨大的LINQ语句并不适合我.

看起来我仍在将查询编码到用户界面中,现在它只是LINQ而不是SQL.但是,我觉得在L2S类和UI之间构建另一层会削减LINQ的一些灵活性.是不是要减少你为获取数据写的代码量?

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



1> Eduardo Molt..:

您的所有LINQ查询都应该在业务逻辑类中,而不是像ADO这样的旧方法.

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

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


如果你是纯粹主义者,你会返回IList;)或者甚至更好的IEnumerable
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有