代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

数据访问的最佳实践Re:Linq to SQL

  •  6
  • Brant Bobby  · 技术社区  · 16 年前

    我正在开发的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?我们将非常感谢您的建议。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Eduardo Molteni    16 年前

    所有LINQ查询都应位于 业务逻辑类 没有改变像ADO这样的老方法。

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

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

        2
  •  1
  •   aku    16 年前

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