关于asp.net:最佳实践:LINQ To SQL进行数据访问

关于asp.net:最佳实践:LINQ To SQL进行数据访问

Best practices re: LINQ To SQL for data access

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

用户-> MessageDetail <-消息<-MessageCategory

MessageDetail是一个联接表,还包含一个IsRead标志。

邮件列表按类别分组。我在页面上有两个嵌套的ListView控件-一个输出组名,而另一个嵌套在内部,绑定到MessageDetails并输出消息本身。在列出消息的页面的代码中,我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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的方式?建议将不胜感激。


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

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

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


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


推荐阅读

    linux看用户信息命令?

    linux看用户信息命令?,系统,密码,信息,状态,软件,情况,命令,用户,网络,时间,l

    linux下删除用户命令?

    linux下删除用户命令?,系统,代码,邮箱,用户组,命令,用户,名称,管理,电脑,账

    用户id的linux命令?

    用户id的linux命令?,系统,密码,信息,联系方式,地址,位置,用户,命令,用户名,

    linux删除用户组命令?

    linux删除用户组命令?,管理,系统,密码,电脑,名称,用户,用户组,名字,信息,工

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    linux登陆用户命令?

    linux登陆用户命令?,系统,工具,信息,地址,软件,工作,命令,数字,服务,名称,Lin

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    复制项目的linux命令?

    复制项目的linux命令?,系统,项目,文件,命令,目录,源文件,语法,选项,目标,功

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux命令项目部署?

    linux命令项目部署?,项目,服务,环境,软件,系统,代理,管理,统一,做好,业务,怎

    linux用户组命令设置?

    linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命

    linux进入用户命令行?

    linux进入用户命令行?,系统,地址,工作,服务,信息,命令,首页,电脑,密码,终端,L

    linux用户用不了命令?

    linux用户用不了命令?,系统,档案,不了,命令,网络,密码,信息,情况,用户,权限,l

    linux新增用户组命令?

    linux新增用户组命令?,系统,密码,新增,用户组,联系方式,软件,邮箱,工具,管