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 条评论
登录 后参与评论

相关文章

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

C# 使用SqlBulkCopy类批量复制大数据

特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].Col...

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

DataTable的AcceptChange方法为什么不能在Update之前?

本人转载http://www.cnblogs.com/telnet_mike/archive/2011/08/29/2159013.html

1041
来自专栏.NET开发者社区

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)》,我们完成了:

2019
来自专栏圣杰的专栏

ABP入门系列(16)——通过webapi与系统进行交互

源码路径:Github-LearningMpaAbp 1. 引言 上一节我们讲解了如何创建微信公众号模块,这一节我们就继续跟进,来讲一讲公众号模块如何与系统...

1.3K6
来自专栏古时的风筝

ASP.NET-自定义HttpModule与HttpHandler

在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中...

2568
来自专栏恰同学骚年

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

  关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认识即可。

993
来自专栏张善友的专栏

Quartz.net官方开发指南 第九课: JobStore

JobStore负责保持对所有scheduler “工作数据”追踪,这些工作数据包括:job(任务),trigger(触发器),calendar(日历)等。为你...

2429
来自专栏恰同学骚年

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

  关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认识即可。

1135
来自专栏木宛城主

开源依旧:再次分享一个进销存系统

开篇 我之前发过一篇博文《两天完成一个小型工程报价系统(三层架构)》,不少朋友向我要源码学习,后来久而久之忘记回复了。今天我再分享一个进销存系统,只为学习,没...

59610
来自专栏奇梦博客

Linux 系统虚拟主机 .htaccess 限制 IP 访问的方法 Linux 转载 Apache

这里列出的是一些可用的规则,目前虚拟主机的 Apache 配置是默认放开这个限制的,如果添加了这个规则(报错页面就403)

1412

扫码关注云+社区