上一节中,我已经写过了利用OR设计器生成对象模型的方式,其实生成这样对数据库进行映射的模型的方式不只这一种,不过VS为我们提供的这种设计器真的是很强大,在实际应用中也是经常用到的
这一节写利用LINQ to SQL对数据库进行的简单增删改查的操作的实现方式,这里注意是“简单”,复杂的查询呢,我将会在下一篇或者下下一篇中写到,那里会有很多的内容,比如处理并发啦,自定义LINQ表达式查询啦,等等的这些,而下一篇中我计划写一些关于扩展OR设计器生成的代码以及向实体类中添加验证的一些东西,因为毕竟我们使用OR设计器生成代码的时候,还不够灵活
好了,回到正题,我们还延续上一节的内容,假设我们已经把我们的dbml设计成了以下的这个样子
这里看到,我在OR视图中添加了两个有主外键关系的表,一个视图,和一个存储过程,下面示范怎样来执行增删改查
查询
首先我们假设要查询Customers表中所有City为London的数据项
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var customer = from c in dc.Customers
where c.City=="London"
select c;
foreach (Customers c in customer)
{
Console.WriteLine(c.CustomerID + " | " + c.City);
}
这个我才第一篇中应该也是写过的,而且语言很简单,因为我们已经完全不用管NorthWindDataContext 的内部到底是怎样实现这个查询的啦
然后,我们在Customers表里添加一条数据,CustomerID为blogs,CompanyName为xiaoyaojian,City为London,当然小白现在没有在伦敦啦,只是为了使用上面的代码,验证一下我们的操作是否成功,其他字段呢,因为都是允许为空,也没有其他的约束,我就不写啦
插入数据行
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
//声明一个Customers的示例,这里相当于数据表中的一行数据
Customers insertCustomer = new Customers() { CustomerID = "blogs", CompanyName = "xiaoyaojian", City = "London" };
dc.Customers.InsertOnSubmit(insertCustomer);//当提交更改时候插入insertCustomer到表Customers中
dc.SubmitChanges();//提交更改
var customer = from c in dc.Customers
where c.City=="London"
select c;
foreach (Customers c in customer)
{
Console.WriteLine(c.CustomerID + " | " + c.City);
}
我们F5运行,会看到下面的效果
我们看到已经有CustomerID为blogs的信息输出啦,说明我们已经成功的插入了数据行
那么,我们刚才插入的数据并不完整,我们要修改或者在这里说,补充完整我们刚才插入的数据,就需要这么干啦
修改数据行
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var query = from c in dc.Customers
where c.CustomerID == "blogs"
select c;
//得到我们想要的数据行
Customers blogsCustomer = query.First();
blogsCustomer.Country = "Tianjin";//追加信息
blogsCustomer.CompanyName = "Xiaoyaojian";//追加信息
dc.SubmitChanges();//提交更改
var queryCustomers = from c in dc.Customers
where c.City == "London"
select c;
foreach (Customers cust in queryCustomers)
{
Console.WriteLine(cust.CustomerID+" | "+cust.CompanyName+" | "+cust.Country);
}
F5,运行,我们可以看到如下结果
结果已经显示出来啦,那么现在这条数据呢,我们需要删除,因为天津没有伦敦这个地方,,,这叫什么话,反正呢,假设我们现在需要删除这条数据,怎么做呢
删除数据行
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var xiaoyaojian = from c in dc.Customers
where c.CustomerID == "blogs"
select c;
dc.Customers.DeleteOnSubmit(xiaoyaojian.First());//提交更改时,删除这条数据
dc.SubmitChanges();
var queryCustomers = from c in dc.Customers
where c.City == "London"
select c;
foreach (Customers cust in queryCustomers)
{
Console.WriteLine(cust.CustomerID+" | "+cust.CompanyName+" | "+cust.Country);
}
运行,出结果
在输出结果中,我们已经CustomerID为blogs的这条记录啦
查询视图
查询视图呢,和查询表是一样的
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var query = from c in dc.Category_Sales_for_1997
select c;
foreach (Category_Sales_for_1997 c in query)
{
Console.WriteLine(c.CategoryName + " | " + c.CategorySales);
}
运行,出结果
绝对的雷同,不是巧合,当然了,访问视图的规则,还是必须要和数据库中我们创建视图的规则一样的,能怎么操作,不能怎么操作,不是由LINQ to SQL决定的,OR设计器只是帮助我们生成了一个实体类对于视图结果集的一个映射而已
调用存储过程
OR设计器为我们生成了一个方法来调用存储过程,当这个存储过程有返回值的时候,OR设计器也会为我们生成一个数据实体的映射,下面演示一下调用方式
NorthWindDataContext dc = new NorthWindDataContext("Data Source=XIAOYAOJIAN;Initial Catalog=Northwind;Integrated Security=True");
var query = dc.CustOrderHist("ALFKI");
foreach (CustOrderHist_个结果 c in query)
{
Console.WriteLine(c.ProductName+" | "+c.Total);
}
Console.ReadKey();
运行,出结果
怎么样,简单到不可思议吧,必要怀疑,不要以为LINQ to SQL是多么高深的话题,完全没有,但是,中国话呀,就是这样,一说“但是”就要麻烦啦,没错,在我们享受它的方便快捷的同时,也会经常遇到这样那样的问题,并发处理,怎样支持事务,事务回滚,解决各种各样的冲突,这些我计划会才下下一篇中详细写到,也未必全面,只是会写一些我遇到的或者知道的,在实际应用中,就要靠大家经验的积累啦