LINQ to SQL
2010-02-08 15:41
197 查看
"LINQ to SQL" 这个名字看上去有点古怪,不过换成 "System.Data.Linq",或者更干脆一点叫 "Microsoft ORM for .net",我想你就明白它能干什么了。它的用法和 XPO、Castle ActiveRecord 有那么点相似,通过特性定义实体(Entity),然后使用一个上下文对象(Context)来管理实体的操作。
开发演示
1. 准备相应的数据库。虽然 LINQ to SQL 能通过实体定义来生成数据库,但为了演示方便,我们事先准备好一个简单的数据库。
SQL Server 2005
-------------------------
2. 定义实体类型。
引入 "System.Data.Linq" 后,我们就可以使用一些特定的特性(Attribute)来定义实体。比如用 TableAttribute 定义对应的数据表,用 ColumnAttribute 定义对应的数据列,是不是和 ActiveRecord 很像?本文只是做简单的演示,有关更具体的细节,请参考 MSDN 文档。
using System.Data.Linq;
[Table(Name="User")]
public class User
{
[Column(Name="Id", IsDBGenerated=true, IsPrimaryKey=true)]
public int Id { get; set; }
[Column(Name="Name")]
public string Name { get; set; }
}
3. 创建调用代码。
"LINQ to SQL" 通过 DataContext 和 Table<T> 类型来管理实体的操作行为。
(1) 添加
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User u = new User();
u.Name = "Tom";
users.Add(u);
context.SubmitChanges();
}
(2) 查询
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
var q = (from u in users where u.Name == "tom" select u).First();
Console.WriteLine(q.Name);
}
(3) 更新
string connStr = @"...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom" select u).First();
q.Name = "tom2";
context.SubmitChanges();
}
(4) 删除
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom2" select u).First();
users.Remove(q);
context.SubmitChanges();
}
(5) 刷新
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
// 创建新用户
User user = new User();
user.Name = "user1";
users.Add(user);
context.SubmitChanges();
// 查询并修改
User q = users.Single<User>(u => u.Name == "user1");
q.Name = "xxxxxx";
context.SubmitChanges();
// 刷新对象
context.Refresh(user, RefreshMode.OverwriteCurrentValues);
Console.WriteLine(user.Name);
}
上面的例子虽然很简单,但可以看出其使用方法非常简单。加上 LINQ 语法,可以想象这将对 .net 平台的 ORM 产生深远的影响。
按照惯例,Visual Studio 肯定会提供自动代码生成工具,我们可以使用内置的 "LINQ to SQL File" 将数据表从 Database Explorer 直接拖拽到 Diagram 来生成实体和强类型 DataContext 代码。如果想自己开发代码生成器,那么还有相应的命令行工具(C:/Program Files/Microsoft Visual Studio 9.0/SDK/v3.5/Bin/SqlMetal.exe)可以使用。
我们会在后面的章节继续研究 "LINQ to SQL" 的其它功能。
开发演示
1. 准备相应的数据库。虽然 LINQ to SQL 能通过实体定义来生成数据库,但为了演示方便,我们事先准备好一个简单的数据库。
SQL Server 2005
-------------------------
2. 定义实体类型。
引入 "System.Data.Linq" 后,我们就可以使用一些特定的特性(Attribute)来定义实体。比如用 TableAttribute 定义对应的数据表,用 ColumnAttribute 定义对应的数据列,是不是和 ActiveRecord 很像?本文只是做简单的演示,有关更具体的细节,请参考 MSDN 文档。
using System.Data.Linq;
[Table(Name="User")]
public class User
{
[Column(Name="Id", IsDBGenerated=true, IsPrimaryKey=true)]
public int Id { get; set; }
[Column(Name="Name")]
public string Name { get; set; }
}
3. 创建调用代码。
"LINQ to SQL" 通过 DataContext 和 Table<T> 类型来管理实体的操作行为。
(1) 添加
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User u = new User();
u.Name = "Tom";
users.Add(u);
context.SubmitChanges();
}
(2) 查询
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
var q = (from u in users where u.Name == "tom" select u).First();
Console.WriteLine(q.Name);
}
(3) 更新
string connStr = @"...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom" select u).First();
q.Name = "tom2";
context.SubmitChanges();
}
(4) 删除
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
User q = (from u in users where u.Name == "tom2" select u).First();
users.Remove(q);
context.SubmitChanges();
}
(5) 刷新
string connStr = @"Data Source=...";
using (DataContext context = new DataContext(connStr))
{
Table<User> users = context.GetTable<User>();
// 创建新用户
User user = new User();
user.Name = "user1";
users.Add(user);
context.SubmitChanges();
// 查询并修改
User q = users.Single<User>(u => u.Name == "user1");
q.Name = "xxxxxx";
context.SubmitChanges();
// 刷新对象
context.Refresh(user, RefreshMode.OverwriteCurrentValues);
Console.WriteLine(user.Name);
}
上面的例子虽然很简单,但可以看出其使用方法非常简单。加上 LINQ 语法,可以想象这将对 .net 平台的 ORM 产生深远的影响。
按照惯例,Visual Studio 肯定会提供自动代码生成工具,我们可以使用内置的 "LINQ to SQL File" 将数据表从 Database Explorer 直接拖拽到 Diagram 来生成实体和强类型 DataContext 代码。如果想自己开发代码生成器,那么还有相应的命令行工具(C:/Program Files/Microsoft Visual Studio 9.0/SDK/v3.5/Bin/SqlMetal.exe)可以使用。
我们会在后面的章节继续研究 "LINQ to SQL" 的其它功能。
相关文章推荐
- LINQ to SQL SqlMethods操作
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符) (转帖)
- LINQ To SQL中IN的用法
- LINQ to Sql系列一 增,删,改
- LINQ : 如何为LINQ TO SQL实现自定义业务逻辑
- LINQ : 谈谈LINQ TO SQL中的直接加载和延迟加载
- asp.net Linq TO Sql 分页方法
- Linq to SQL: 自定义排序
- Linq to Sql 总生成 where ID is null 的解决办法
- LinQ to SQL
- MonoRail和Linq To SQL的兼容性问题
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- LINQ to SQL快速上手 step by step
- LINQ To SQL
- 【转】一步一步学Linq to sql(三):增删改
- 【转】一步一步学Linq to sql(九):其它补充
- LINQ to SQL 建立实体类
- LINQ体验(17)——LINQ to SQL语句之动态查询
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统(源代码下载和PDF文档下载)
- LINQ TO SQL语句