LINQ to SQL(3):增删改查

上一节中,我已经写过了利用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是多么高深的话题,完全没有,但是,中国话呀,就是这样,一说“但是”就要麻烦啦,没错,在我们享受它的方便快捷的同时,也会经常遇到这样那样的问题,并发处理,怎样支持事务,事务回滚,解决各种各样的冲突,这些我计划会才下下一篇中详细写到,也未必全面,只是会写一些我遇到的或者知道的,在实际应用中,就要靠大家经验的积累啦

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

ret2resolve学习笔记

一是做个总结,二是做个备份。上篇文章感谢@大米指出的错误,格式化字符串漏洞还未销声匿迹!!!

840
来自专栏更流畅、简洁的软件开发方式

我的数据访问类(第二版)—— for .net2.0 (二)

下面写一下相对来说不变的地方 SQL语句部分,改成了静态函数的形式。 using System; using System.Collections.Generi...

1448
来自专栏听雨堂

【4】通过简化的正则表达式处理字符串

阅读目录 常见字符串操作 使用正则表达式处理字符串 “前后限定”查找目标 自动处理转义字符 界定串的通用化 多个目标的匹配 进一步扩展 结论 在...

1966
来自专栏進无尽的文章

简述OC语言

对于一门语言的学习是需要时间领悟的,而对于一些原理性的问题,我们需要清楚其核心思想,知其然而知其所以然,这样才能有利于自己的后续发展。本文只是简述,没有面面具到...

922
来自专栏PHP技术

PHP的几个常用加密函数

在网站的开发过程中,常常需要对部分数据(如用户密码)进行加密,本文主要介绍PHP的几个常见的加密函数

1266
来自专栏魂祭心

原 荐 以太坊 p2p Server 原理及

4865
来自专栏影子

SpringBoot中关于Mybatis使用的三个问题

4049
来自专栏欧阳大哥的轮子

iOS的MVC框架之模型层的构建

这篇文章是论MVVM伪框架结构和MVC中M的实现机制的姊妹篇。在前面的文章中更多介绍的是一些理论性质的东西,一些小伙伴在评论中也说希望有一些具体设计实践的例子,...

802
来自专栏跟着阿笨一起玩NET

EF性能之关联加载

 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌不能兼得。但是,通过...

462
来自专栏C#

DotNet加密方式解析--散列加密

   没时间扯淡了,赶紧上车吧。    在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全、支付宝和微信账户安全、以及邮箱等等,说到信息安...

2058

扫码关注云+社区