LinQ to SQL系统的层次架构设计

news/2025/2/25 4:07:34

参考资料

【1】http://www.codeproject.com/KB/aspnet/SaltAndPepper.aspx?display=Print

【2】Manning LINQ in action

【3】ScottGu, LINQ to SQL, 2007

前言

有了LINQ之后,我发现开发ASP.NET网站的时候,编写数据库操作也成为了一件有意思的事情。为了更好在应用LINQ的过程中适应系统的N-Tier架构设计,需要进行一些研究。

简介

N-Tier架构其实可以用3-Tier架构来概括,分为Presentation Layer,Business Logic Layer和Data Access Layer。 LINQ to SQL is an ORM (object relational mapping) implementation that allows you to model a relational database using .NET classes.

Business Logic Layer的作用简要说来就是一个词:Shaping。

LINQ的问题

传统的3层架构Need to write business logic mapping from DAL data sources[1].70% projects in IT industry are CRUD projects. In 3-tier architecture the CRUD operation needs to transfer data to and from between layers. Due to inconsistent data representation between tiers the matter gets more complicated for CRUD operations[1]. LINQ提供了“a consistent data representation across all tiers and general query mechanism by which we can filter and sort business objects.”[1]。

业务层的功能主要是areas of performance,maintainability, and code reuse.[2] p8.3

但是在目前,LINQ最大的问题是如何跨多个表返回数据类型,以及UI数据字段名称与DB数据字段名称之间的映射(这样可以更好的解耦和数据库设计和ASPX页面代码)。因为在UI层需要大量不一样的数据显示。(把这个归入UI层?)

目前的解决办法是,在BO层的返回数据直接使用DAL的entity类,而在UI层的ASPX.VB代码中进行数据字段名称映射,这样可以让ASPX网页代码相对稳定,而且有能够通过LINQ的特性,在数据库改动时通过编译提示代码更新。

UI代码:

        dropDownList.DataSource = From c In GetMaterialsAccessor.Filters(userid, containOthers) _

                                  Select fnumber = c.FilterNumber, fname = c.FilterName

BO层代码:

    Public Function Filters(ByVal ownerID As String, ByVal includeOthers As Boolean) As IQueryable(Of MaterialOutgoingFilter)

        Dim a As New HillytonMaterialsDataContext

        Dim query = From c In a.MaterialOutgoingFilters _

                    Where c.OwnerID = ownerID Select c

        If includeOthers Then

            Dim otherquery = From c In a.MaterialOutgoingFilters _

                        Where c.OwnerID <> ownerID And c.Private = 0 _

                          Select c

            query = query.Concat(otherquery)

        Else '仅包含系统管理员的公共过滤器

            Dim others = From c In a.MaterialOutgoingFilters _

                         Where c.OwnerID <> ownerID And c.OwnerID = "0000" And c.Private = 0 _

                         Select c

            query = query.Concat(others)

        End If

        Return query

    End Function

这看来是一个比较可行的方法了,在这里,LINQ语句作为“Common Query Language[1]”在BO层和UI层发挥作用 。那么最基础的工作就是要设计好数据库表,这样通过LINQ自动生成的Entity类才能够易于使用。

那么现在看来,LINQ跨越多个表查询的时候,一个简单的并且与上述实现方式一致的实现方式也就是返回entity对象,通过数据库的主键、外键关联得到其它表的数据,在UI层使用LINQ进行跨表取数据。

转载于:https://www.cnblogs.com/hanshuifang/archive/2009/08/26/1554266.html


http://www.niftyadmin.cn/n/674415.html

相关文章

10只开基半年业绩翻倍 下半年将换位

除了指数型基金大放异彩外&#xff0c;截至6月19日公布的基金净值看&#xff0c;共有10只开放式股票型基金的业绩不到半年实现翻番。华夏大盘精选基金今年以来的涨幅更是位居所有开放式基金业绩之首&#xff0c;达14..45&#xff05;。 翻倍基金大多名不见经传 按照年初以来净值…

Javascript里使用Dom操作Xml笔记之常用函数[转]

一&#xff0e;本笔记使用的Xml文件 <?xml version"1.0"?> <book level"1"> <Name>c</Name> <rice>20</Price> <info> <k>1</k> </info> <info> <k>2</k…

.net reflector 6.6安装注册

1.官网下载安装包含.net reflector的集合包&#xff0c;单独下载的版本无法注册 .NET Developer Bundle&#xff08;当前版本1.6.1.3&#xff09; 2.下载danny su 的 RedGate Licensing http://rapidshare.com/files/396596167/RedGate.Licensing.exe 3.安装原版&#xff0c;选…

菜鸟学习笔记-linux shell 下不拷贝和tab使用带来所执行程序不认的情况

&#xff08;1&#xff09; 银河麒麟下&#xff0c;将文本中的命令拷贝到shell 命令行下出现异常错误 &#xff08;2&#xff09;ubuntu 18.04 下自己的测试demo 在输入文件路径时候&#xff0c;错用tab按键&#xff0c;再退格&#xff0c;程序出现异常&#xff0c;可以执行&a…

ASP.NET 2.0轻松搞定统计图表(二)

前台代码&#xff1a;<% Page Language"C#" AutoEventWireup"true" CodeFile"OWCdrawing.aspx.cs"Inherits"OWCdrawing" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.o…

iperf2.0和iperf3比较以及影响udp丢包率的参数

文章背景&#xff1a; 最近在做40G交换板的TCP带宽和UDP带宽、丢包率、抖动测试&#xff1b; 发现iperf与iperf3版本不同对测试结果有较大影响&#xff1b;通过自己试验与网络查找资料有结论如下。 第一部分&#xff1a;iperf与iperf3比较 1&#xff09;iperf3较iperf测试U…

【图论】【poj 3026】Borg Maze

问题 S在迷宫中找A&#xff0c;找到A之后就把它同化&#xff0c;也会帮着S找剩下的A。。就是这样。。给你的是一个字符组成的图…… 分析 正常人会想到搜索……当然&#xff0c;但是只是搜索很难实现&#xff0c;仔细读题&#xff0c;我们发现&#xff0c;其实质是在求最小生成…