Visual Studio 2008 使用 LINQ 进行 ORM






4.50/5 (10投票s)
使用 LINQ 进行 ORM 映射。
目录
- 引言
- Northwind LINQ Web 应用程序
- 创建 LINQ 数据模型项目
- 创建 ASP.NET Web 应用程序
- 结论
引言
Microsoft 通过引入 LINQ(Language Integrated Query,语言集成查询)进入了 ORM(Object Relational Mapping,对象关系映射)领域。这是 Visual Studio 2008 和 .NET Framework 3.5 中的内置功能,于 2007 年 11 月 19 日公开发布。
像大多数 ORM 数据模型一样,LINQ 提供了将数据库和其他形式的数据存储(如 XML)视为纯对象的能力。例如,如果您的数据存储是 SQL Server 关系数据库,那么 LINQ 会将您的表转换为称为“实体”的对象,并将表字段视为“属性”。LINQ 还通过将存储过程用作“方法”(为您的对象提供功能)来提供对存储过程的全面支持。
那么为什么有人想使用 LINQ 呢?好吧,在当今的大多数情况下,如果您想为对象提供数据,您会执行以下步骤:
- 使用连接字符串通过 ADO.NET 命令进行身份验证和连接到数据库
- 调用存储过程或运行 SELECT SQL 语句来获取数据
- 将其存储在 DataSet 或 DataReader 对象中,然后
- 最后将其绑定到某些数据控件(例如,GridView、DropdownListBox 等)。
假设您有一个名为 ADOSqlHelper 的 ADO.NET 包装器,您的代码可能看起来类似于此:
string conStr = “”;
DataSet ds = ADOSqlHelper.GetDataSource(conStr,“SELECT * FROM Customers”)
GridView1.DataSoure = ds.Tables[0];
GridView1.DataBind();
这样做并没有什么不对,但是使用 LINQ 提供了一种替代方案。一旦您使用 Visual Studio 2008 中的设计器面板定义了 LINQ 对象模型,就可以使用新的 C# 语法通过几条语句即可用数据填充 GridView 控件。
GridView1.DataSource = from cust in Customers select cust;
GridView1.DataBind();
此外,LINQ 会为您处理后台的细节。它甚至负责编写插入、更新和删除数据的代码。
在本文中,您将通过一个循序渐进的示例学习如何使用 LINQ,创建一个访问数据的基础网站。我已将示例演示 Web 应用程序打包为 zip 文件。请阅读下面的“应用程序要求”部分,了解安装和使用它的说明。
我绝不是 LINQ 专家,LINQ 中还有很多东西需要学习。本文仅作为介绍。有关更多信息,请访问 http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx。
要求
- 安装了 .NET Framework 3.5 和 Visual Studio 2008 的计算机。
- 可以访问本地或网络实例的 SQL Server。
- 附加到 SQL Server 的 Northwind 数据库副本(您可以在此处获取)。
- 假设开发人员至少具备开发 .NET Windows 和 Web 应用程序的基本经验。
安装和编译示例代码
- 下载随本文提供的 NothwindLingWebApplication.zip 文件。
- 将文件解压缩到本地驱动器上的一个文件夹。
- 打开项目解决方案,并对以下文件进行以下配置更改:
- 项目名称: NorthWindLINQSampleAppDataService
- 文件: App.Config、Setting.settings 和 Setting.designer.cs
- 更改:连接字符串属性 Data Source、User ID 和 Password 的值,使其与您的数据库匹配。
- 通过生成解决方案进行编译。
- 运行应用程序。
Northwind LINQ Web 应用程序
Northwind LINQ Web 应用程序是一个演示 ASP.NET Web 应用程序,使用 Visual Studio 2008(C#)和 .NET Framework 3.5 编写。它具有以下两个主要功能,如下面的主屏幕所示:

当您选择“查看和管理 Northwind 客户”链接时,会显示一个页面,其中列出了 Northwind Microsoft SQL Server 示例数据库中的客户。在该页面上,您可以添加、编辑和删除客户。请参见下面的屏幕截图。

当您从主屏幕选择“查看 Northwind 供应商及其产品”链接时,会显示一个页面,其中列出了供应商及其产品。

目标是使用 LING 作为 ORM 来实现演示应用程序的这些功能。为此,将创建一个具有两个项目的 Visual Studio 2008 解决方案。第一个项目是一个类库,用于存放我们的数据模型。第二个项目是一个 ASP.NET Web 应用程序,其中包含使用类库项目中创建的对象数据模型页。
创建 LINQ 数据模型项目
要开始开发 LINQ 数据模型,我们创建一个新的类库项目。请参见下面的屏幕截图。

接下来,我们向项目中添加一个名为“Northwind”的新“LINQ to SQL”项。它的扩展名为“DBML”(数据库模型缩写)。

此文件将用作新创建的 Northwind 对象数据库模型的容器。它实际上包含两个窗格:一个用于存放具有属性(表字段)的实体(表),另一个用于存放方法(可选的存储过程)。请参见下面的屏幕截图。

LINQ 需要知道要使用哪个服务器和数据库。为此,需要建立数据库连接。要连接到数据库,请在 Visual Studio 2008 设计器中,单击“工具”菜单,然后选择“连接到数据库…”项。然后会提示您选择数据源,如以下屏幕截图所示。

然后,它将提供选择要建模的 SQL Server 实例和数据库的机会。请参见下文。

如果成功连接到数据库,则 Visual Studio 设计器面板现在将包含“服务器资源管理器”列,其中显示所选数据库及其表和存储过程,如以下屏幕截图所示。

现在只需打开“表”和“存储过程”文件夹,然后将要包含在模型中的表(数据类)和存储过程(方法)拖放到相应区域。对于此项目,将表 Customer、Order、Order_Detail、Supplier 和 Product 拖放到数据类窗格中。还将存储过程 CustOrderHist 拖放到方法窗格中。Visual Studio 窗口显示如下。

如图所示,模型以对象关系模型的形式呈现。类及其属性显示为方框。此外,请注意类之间的多对一关系,如箭头所示。不要忘记右侧显示的存储过程。就是这样!模型已完成,我们甚至没有编写一行代码。为我们的 Web 应用程序提供所需的所有功能都已完成(包括添加、选择、更新和删除数据)。实际上,后台发生了许多事情。但这超出了本文的范围。请访问 MSDN。现在,让我们继续实现 ASP.NET Web 应用程序。是时候开始编码了。
创建 ASP.NET Web 应用程序
现在我们有了一个 Web 应用程序可以使用的、用于处理数据的模型,我们可以开始查看应用程序的功能了。Web 应用程序必须提供以下功能:
- 显示客户列表
- 添加新客户
- 编辑现有客户
- 删除现有客户
- 显示供应商列表及其每个供应商的产品。
向 Visual Studio 2008 解决方案添加一个新的 ASP.NET Web 应用程序项目。添加对上面创建的数据模型项目的引用。请参见下面的屏幕截图。

为了节省时间,请下载并安装随附的示例演示应用程序 zip 文件,以便查看 ASPX 和 C# 代码文件,因为我现在将参考它们来继续演示。请参见上面的“引言”部分中的要求和安装说明。
显示客户列表
CustomerListing.aspx 文件包含一个 GridView 控件,该控件用于绑定到我们在数据模型中创建的 Customers 对象。位于 CustomerListing.aspx.cs 文件中的代码隐藏文件包含以下代码片段:
NorthwindDataContext db = new NorthwindDataContext();
var customers = from c in db.Customers select c;
grdCust.DataSource = customers;
grdCust.DataBind();
将数据模型类库引用到 ASP.NET Web 项目后,为了开始使用其对象,您必须创建一个 DataContext 类的实例。此类是 LINQ 的核心。它是您从数据库检索数据并提交更改的对象。它充当应用程序请求到 SQL 查询的翻译器。
注意 .NET Framework 3.5 的新 C# 语法。使用新的 DataContext 实例,所有对象和方法都可供您查询。Intellisense 使使用它非常容易。请参见下面的屏幕截图。

要获取列表,只需声明一个变量(使用var
),并将其设置为查询语句“from
c in db.Customers select c;”
。然后将 GridView 的 DataSource 属性设置为该变量,并调用其 DataBind 方法。
添加新客户
将新客户添加到 Northwind 数据库同样简单。Web 表单文件 CustomerAdd.aspx 包含三个 TextBox 控件,用于保存三个输入值:客户 ID、公司名称和联系人姓名。C# 代码隐藏文件 CustomerAdd.aspx.cs 提供了创建 Customers 表中新记录所需的 LINQ 语法。
NorthwindDataContext db = new NorthwindDataContext();
Customer customer = new Customer();
customer.CustomerID = txtCustomerID.Text.Trim();
customer.CompanyName = txtCompanyName.Text.Trim();
customer.ContactName = txtContactName.Text.Trim();
db.Customers.InsertOnSubmit(customer);
db.SubmitChanges();
首先创建 NorthwindDataContext
对象的实例。然后使用 Customer 对象创建一个新客户。将客户的属性(CustomerID
、CustomerName
和 ContactName
)设置为 TextBox 控件的值。然后调用 InsertOnSubmit
方法,将客户对象作为包含要插入数据库的数据的参数传递。为了使更改生效,必须调用 SubmitChanges
方法。就是这样!您无需担心数据库连接、编写查询等。
更新客户
更新客户记录与添加新记录非常相似。请参阅 CustomerEdit.aspx 和 CustomerEdit.aspx.cs 来查看网页的布局。
//get the customer id that we want to edit from query string;
string customerID = Request.QueryString["customerID"].ToString();
//Use LINQ syntax to get customerID's data to be edited
NorthwindDataContext db = new NorthwindDataContext();
Customer customer = db.Customers.Single(c => c.CustomerID == customerID);
//set the customer properties to the text box controls
customer.CompanyName = txtCompanyName.Text;
customer.ContactName = txtContactName.Text;
//submit changes to take effect
db.SubmitChanges();
首先从 Http 请求 QueryString
变量中获取客户 ID。接下来,使用 DataContext 实例从该客户的 Customers 对象中返回单个记录。然后将客户对象的值设置为 TextBox
控件的 Text
属性。最后,调用 SubmitChanges
方法,以便更改生效。
删除客户
删除客户与更新客户非常相似。请参阅 CustomerDelete.aspx 和 CustomerDelete.aspx.cs 文件来查看网页的布局。
string custID = "";
if (Request["CustomerID"] != null)
custID = Request["CustomerID"].ToString();
if (custID.Length != 0)
{
NorthwindDataContext db = new NorthwindDataContext();
Customer customer = db.Customers.Single(c => c.CustomerID == custID);
db.Customers.DeleteOnSubmit (customer);
db.SubmitChanges ();
}
首先从 Http 请求 QueryString 变量中获取客户 ID。接下来,使用 DataContext 实例从 Customers 对象中返回该客户的单个记录。然后调用 Customers 对象的 DeleteOnSubmit
方法。最后,调用 SubmitChanges
方法,以便命令生效。
显示供应商列表及其产品
显示供应商列表有点复杂,因为它将涉及将一个 GridView 控件显示为另一个 GridView 控件的列。请参阅 SupplierListing.aspx 和 SupplierListing.aspx.cs 文件来查看页面的布局。下面显示了 ASPX 文件的一部分。
<asp:GridView ID="grdSuppliers" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="SupplierID" HeaderText="Supplier ID" />
<asp:BoundField DataField="CompanyName" HeaderText="Company Name" />
<asp:BoundField DataField="ContactName" HeaderText="Contact Name" />
<asp:TemplateField HeaderText="Products">
<ItemTemplate>
<asp:GridView ID="GridView1" AutoGenerateColumns ="false" runat="server"
DataSource ='<%# GetSupplierProducts (
(int)DataBinder.Eval(Container.DataItem, "SupplierID") ) %>'>
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="Product ID" />
<asp:BoundField DataField="ProductName" HeaderText="Product Name" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
正如您所见,ID 为 grdSuppliers
的 GridView 控件包含三个 BoundField 列和一个 TemplateField 列。TemplateFiled 列是一个 GridView 控件,其中包含表示产品 ID 和产品名称的两列。此 GridView 的 DataSource 设置为名为 GetSupplierProducts
的方法,该方法返回一个 IQueryable<Product>
(对象模型中的集合)。实现方法如下所示:
public IQueryable<Product> GetSupplierProducts(int supplierID)
{
NorthwindDataContext db = new NorthwindDataContext();
var products = from p in db.Products where p.SupplierID == supplierID select p;
return (products);
}
此方法采用一个整数参数,即预期的供应商 ID。这是通过 DataBinder.Eval
实现的,它是一个 ASP.NET 静态方法,用于在运行时评估数据绑定表达式。接下来,使用以下语法填充 ID 为 grdSuppliers
的 GridView 控件:
NorthwindDataContext db = new NorthwindDataContext();
var supplier = from s in db.Suppliers select s;
//set and bind LINQ source to datagrid control
grdSuppliers.DataSource = supplier;
grdSuppliers.DataBind();
结论
在本文中,我们将 LINQ(Language Integrated Query)介绍为一种 ORM(Object Relational Model)。我们将其定义为一种数据访问方法,该方法以对象数据模型的形式呈现——从 SQL Server 数据库转换而来。它是 Visual Studio 2008 和新的 .NET Framework 3.5 中的内置功能。我们通过一个示例 Visual Studio 2008 项目解决方案进行了说明,该解决方案创建了 2 个项目:数据模型和 ASP.NET Web 应用程序。数据模型提供了 Web 应用程序所需的所有功能,包括检索数据、添加数据、更新数据和删除数据。而且我们没有编写一行 ADO.NET 数据访问代码。
我们还研究了一些新的 C# 集成查询语言语法。这需要一些学习曲线。要开始使用数据模型,我们看到它必须首先被引用到项目中。之后,可以创建一个新的 DataContext 实例,以便访问所有可用于查询的对象和方法。