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

相关文章

来自专栏葡萄城控件技术团队

WPF的消息机制(一)- 让应用程序动起来

前言 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Window...

1729
来自专栏张善友的专栏

.NET Core系列 :4 测试

2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NE...

18610
来自专栏Kubernetes

Kubernetes Node Co

Author: xidianwangtao@gmail.com NewNodeController入口 Controller Manager在启动时,会启...

3387
来自专栏日常分享

Java 端口扫描器 TCP的实现方法

想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSoc...

521
来自专栏拂晓风起

NHibernate 如何对session管理,实现lazy=true

1526
来自专栏pangguoming

使用ServiceStack构建Web服务

提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛。首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService...

3455
来自专栏Java3y

Java高并发秒杀系统【观后总结】

项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番。 记录在该项目中学到了什么玩意.. 该项目源码对应的g...

8398
来自专栏Android 研究

Android Handler机制3之SystemClock类

官网位置在https://developer.android.com/reference/android/os/SystemClock.html

642
来自专栏技术博客

一步一步学Linq to sql(八):继承与关系

1.首先定义的是Topic实体基类,然后两个子类的继承,NewTopic--主题帖,Reply--回复帖。 2.Topic类上的特性,下面先来看一下特性类

711
来自专栏张善友的专栏

SignalR 项目介绍

SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP...

17810

扫描关注云+社区