一步一步学_Linq_to_sql_9_其它补充
- 格式:docx
- 大小:21.94 KB
- 文档页数:5
Linq语法详细(三种⽅式:linq、Lambda、SQL语法)三种⽅式:linq、Lambda、SQL语法1.简单的linq语法//1var ss = from r in db.Am_recProSchemeselect r;//2var ss1 = db.Am_recProScheme;//3string sssql = "select * from Am_recProScheme";2.带where的查询//1var ss = from r in db.Am_recProSchemewhere r.rpId > 10select r;//2var ss1 = db.Am_recProScheme.Where(p => p.rpId > 10);//3string sssql = "select * from Am_recProScheme where rpid>10";3.简单的函数计算(count,min,max,sum)//1////获取最⼤的rpId//var ss = (from r in db.Am_recProScheme// select r).Max(p => p.rpId);////获取最⼩的rpId//var ss = (from r in db.Am_recProScheme// select r).Min(p => p.rpId);//获取结果集的总数//var ss = (from r in db.Am_recProScheme// select r).Count();//获取rpId的和var ss = (from r in db.Am_recProSchemeselect r).Sum(p => p.rpId);//2//var ss1 = db.Am_recProScheme.Max(p=>p.rpId);//var ss1 = db.Am_recProScheme.Min(p => p.rpId);//var ss1 = db.Am_recProScheme.Count() ;var ss1 = db.Am_recProScheme.Sum(p => p.rpId);Response.Write(ss);//3string sssql = "select max(rpId) from Am_recProScheme";sssql = "select min(rpId) from Am_recProScheme";sssql = "select count(1) from Am_recProScheme";sssql = "select sum(rpId) from Am_recProScheme";4.排序order by desc/ascvar ss = from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descending //倒序// orderby r.rpId ascending //正序select r;//正序var ss1 = db.Am_recProScheme.OrderBy(p => p.rpId).Where(p => p.rpId > 10).ToList();//倒序var ss2 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).ToList();string sssql = "select * from Am_recProScheme where rpid>10 order by rpId [desc|asc]";5.top(1)//如果取最后⼀个可以按倒叙排列再取值var ss = (from r in db.Am_recProSchemeselect r).FirstOrDefault();//()linq to ef 好像不⽀持 Last()var ss1 = db.Am_recProScheme.FirstOrDefault();//var ss1 = db.Am_recProScheme.First();string sssql = "select top(1) * from Am_recProScheme";6.跳过前⾯多少条数据取余下的数据//1var ss = (from r in db.Am_recProSchemeorderby r.rpId descendingselect r).Skip(10); //跳过前10条数据,取10条之后的所有数据//2var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Skip(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10";7.分页数据查询//1var ss = (from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descendingselect r).Skip(10).Take(10); //取第11条到第20条数据//2 Take(10): 数据从开始获取,获取指定数量(10)的连续数据var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10 and rowNum<=20";8.包含,类似like '%%'//1var ss = from r in db.Am_recProSchemewhere r.SortsText.Contains("张")select r;//2var ss1 = db.Am_recProScheme.Where(p => p.SortsText.Contains("张")).ToList();//3string sssql = "select * from Am_recProScheme where SortsText like '%张%'";9.分组group by//1var ss = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect new{n.Key, //这个Key是recTyperpId = n.Sum(r => r.rpId), //组内rpId之和MaxRpId = n.Max(r => r.rpId),//组内最⼤rpIdMinRpId = n.Min(r => r.rpId), //组内最⼩rpId};foreach (var t in ss){Response.Write(t.Key + "--" + t.rpId + "--" + t.MaxRpId + "--" + t.MinRpId);}//2var ss1 = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect n;foreach (var t in ss1){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//3var ss2 = db.Am_recProScheme.GroupBy(p => p.recType);foreach (var t in ss2){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//4string sssql = "select recType,min(rpId),max(rpId),sum(rpId) from Am_recProScheme group by recType";10.连接查询//1var ss = from r in db.Am_recProSchemejoin w in db.Am_Test_Result on r.rpId equals w.rsIdorderby r.rpId descendingselect r;//2var ss1 = db.Am_recProScheme.Join(db.Am_Test_Result, p => p.rpId, r => r.rsId, (p, r) => p).OrderByDescending(p => p.rpId).ToList(); //3string sssql = "select r.* from [Am_recProScheme] as r inner join [dbo].[Am_Test_Result] as t on r.[rpId] = t.[rsId] order by r.[rpId] desc";11.sql中的In//1var ss = from p in db.Am_recProSchemewhere (new int?[] { 24, 25,26 }).Contains(p.rpId)select p;foreach (var p in ss){Response.Write(p.Sorts);}//2string st = "select * from Am_recProScheme where rpId in(24,25,26)";。
LINQ to SQL本章内容:● 使用LINQ to SQL 和Visual Studio 2010 ● 把LINQ to SQL 对象映射到数据库实体上 ● 脱离O/R 设计器构建LINQ to SQL 操作 ● 使用O/R 设计器和自定义对象 ● 用LINQ 查询SQL Server 数据库 ● 存储过程和LINQ to SQL在C# 2010中,令人激动的新增功能之一是.NET LINQ(Language Integrated Query ,语言集成查询架构)架构。
LINQ 主要在编程数据集成的基础上提供了一种轻型外观。
这是一个很好的功能,因为数据是最重要的。
每个应用程序都以某种方式处理数据,无论这些数据来自内存(内存中的数据)、数据库、XML 文件、文本文件还是其他地方。
许多开发人员发现很难把C#中强类型化的、面向对象的数据移动到数据层中(其中对象是辅助类的成员)。
在最好的情况下,从一个环境转换到另一个环境充满了易于出错的操作,且顶多是一个重组过程。
在C#中,用对象编程意味着利用一个强类型化的强大功能处理代码。
很容易在名称空间中导航,使用Visual Studio IDE 中的调试器等。
但是,在访问数据时,情况就大不相同了。
这是一个没有强类型化的环境,调试很痛苦,甚至是不可能的,大部分时间都花在把字符串作为命令发送给数据库。
开发人员还必须注意基础数据,了解它的构造方式或者所有数据点的相互关系。
LINQ 为基础数据存储器提供了一个强类型化的界面。
LINQ 为开发人员提供了在编码环境下工作的方式,可以把基础数据作为对象访问,使用IDE 、IntelliSense 甚至调试功能。
有了LINQ ,我们创建的查询现在就变成.NET Framework 和其他环境中的重要成员。
在对数据存储器执行查询时,会很快发现它们现在正常工作且行为方式类似于系统中的类型。
这说明,现在可以使用任意兼容.NET 的语言并查询基础数据存储器,这在以前是不可能的。
自学快速上手sql语句
要快速上手SQL语句,可以按照以下步骤进行学习:
1.了解SQL基本语法:了解SQL的基本语法结构,包括SELECT、INSERT、UPDATE和DELETE等常用的SQL操作命令。
2.学习SELECT语句:SELECT是查询数据的关键字,学习如何编写SELECT语句来从数据库中检索所需的数据。
3.掌握WHERE子句:WHERE子句用于过滤检索的数据,学习如何使用WHERE子句来根据特定的条件筛选数据。
4.学习聚合函数:了解SQL中的聚合函数,例如SUM、COUNT、AVG等,它们可以用于对数据进行汇总和计算。
5.理解JOIN操作:JOIN操作用于将多个表中的数据进行关联查询,学习不同类型的JOIN操作(如INNER JOIN、LEFT JOIN和RIGHT JOIN)以及如何使用它们。
6.了解索引和视图:索引和视图是SQL中重要的概念,索引可以提高查询性能,而视图可以简化复杂的查询。
7.尝试实践:通过实际操作数据库,编写各种SQL语句来加深理解和熟练掌握SQL的用法。
8.查看参考资料:阅读SQL相关的教程、手册和文档,以便
在学习过程中遇到问题时可以及时解决。
9.参加培训课程或在线学习资源:如果有条件,可以参加一些SQL培训课程或在线学习资源,这些资源通常会提供更为系统和深入的SQL学习内容。
记住,SQL学习需要不断的实践和练习,多写多练才能熟练掌握。
LinQtoSQL⽤法详解LinQ是指集成化查询语⾔,通过映射将内的表名变为C#的类名,将列名作为属性名,将表的关系作为类的成员对象。
O--M--R O-Object对象R-Relation关系M-Mapping映射LinQ包括:LinQ to SQL,针对SQL的查询,它是⼀个带有可视化的操作界⾯的ORM⼯具。
LinQ to Object,⽤来实现对内存中集合对象的查询。
LinQ to DataSet,对强类型化或弱类型化的DataSet或独⽴的DataTable进⾏查询。
LinQ to Entity,对实体框架中EDM定义的实体集合进⾏查询。
(⼀):LinQ to SQL第⼀步:建⽴LinQ2SQL类添加⼀个新建项,选择LinQ to SQL,将⽤到的表拖进来。
第⼆步:实例化上下⽂对象,基本所有操作都是通过上下⽂对象来进⾏的。
MyDBDataContext context = new MyDBDataContext();第三步:操作⼀、增加数据:1.造⼀个要添加的数据对象:Info data = new Info();data.Code = "p211"; = "⽯头";data.Sex = false;data.Nation = "N001";data.Birthday = new DateTime(1990, 1, 2);2.在上下⽂中注册上⾯新造的对象。
.InsertOnSubmit(data);3.提交执⾏context.SubmitChanges();⼆、删除:1. 找出要删除的数据MyDBDataContext context = new MyDBDataContext();var q = .Where(p => p.Code == "p003");2. 删除注册if (q.Count() > 0){Info data = q.First();//注册context.Work.DeleteAllOnSubmit(data.Work);context.Family.DeleteAllOnSubmit(data.Family);.DeleteOnSubmit(data);}3. 提交执⾏context.SubmitChanges();三、修改:1. 找出要修改的数据MyDBDataContext context = new MyDBDataContext();var q = .Where(p=>p.Code == "p001");2. 改,不⽤注册if (q.Count() > 0){Info data = q.First();//改 = "胡⽣";data.Nation = "n001";data.Sex = false;}3. 提交执⾏context.SubmitChanges();四、查询:1.查所有MyDBDataContext context = new MyDBDataContext();//所有⼈员var q = ;//var q = from p in select p;//显⽰foreach(Info data in q){//data.Nation1:当前⼈员对应的民族对象。
LINQ TO SQL 学习笔记1. 预备知识 (3)1.1.Linq介绍 (3)1.2.隐含类型局部变量 (3)1.3.匿名类型 (4)1.4.扩展方法 (5)1.5.自动属性 (6)1.6.对象初始化器/集合初始化器 (6)mbda表达式与Lambda表达树 (7)1.8.查询句法 (9)2. DataContent与实体 (10)2.1.DataContent (10)2.2.实体类 (10)2.3.强类型DataContent (11)2.4.日志功能 (11)2.5.探究查询 (12)2.6.执行查询 (13)2.7.创建数据库 (13)2.8.使用DbDataReader数据源 (14)2.9.生成实体类 (14)3. 增删改 (15)3.1.插入(Insert) (15)3.2.更新(Update) (18)3.3.删除(Delete) (18)3.4.使用Attach更新(Update with Attach) (19)3.5.使用Attach更新和删除(Update and Delete with Attach) (21)4. 查询句法 (22)4.1.Select (22)4.2.Where (23)4.3.OrderBy (23)4.4.分页 (24)4.5.分组 (24)4.6.Distinct (25)4.7.Union (25)4.8.Contact (25)4.9.取相交项 (26)4.10.排除相交项 (26)4.11.子查询 (27)4.12.In操作 (27)4.13.Join (28)5. 存储过程 (28)5.1.普通存储过程 (28)5.2.带参数存储过程 (30)5.3.带返回值的存储过程 (30)5.4.多结果集存储过程 (30)5.5.使用存储过程新增/更新/删除数据 (31)6. 探究特性 (33)6.1.延迟执行 (33)6.2.DataLoadOptions (33)6.3.DataLoadOptions限制 (34)6.4.主键缓存 (35)6.5.DataContent隔离 (35)7. 并发与事务 (35)7.1.检测并发 (35)7.2.解决并发 (36)7.3.事务处理 (38)8. 其他 (40)Linq学习笔记(1.6)——ToArray、ToList、ToDictionary、OfType (40)1.预备知识1.1.Linq介绍LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。
linq to sql 是一个代码生成器和ORM 工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。
但是也有几个测试证明显示在做好优化的情况下,linq to sql 的性能可以提升到 datareader 性能的93%。
因此我总结了linq to sql 的10个性能提升点,来优化其查询和修改的性能。
1. 不需要时要关闭 DataContext 的ObjectTrackingEnabled 属性1 using (NorthwindDataContext context = new NorthwindDataContext())2 {3 context.ObjectTrackingEnabled = false;4 }关闭这个属性会使linq to sql 停止对对象的标识管理和变化跟踪。
但值得注意的是关闭ObjectTrackingEnabled 意味着也将DeferredLoadingEnabled 属性设置为false ,当访问相关表时会返回null 。
2. 不要把所有的数据对象都拖到一个DataContext 中一个DataContext 代表一个工作单元,并非整个数据库。
如果几个数据库对象之间没有关系,或者在程序中用不到的数据库对象(例如日志表,批量操作表等等),让这些对象消耗内存空间和DataContext 对象跟踪服务是完全没有必要的。
建议将所有的数据库对象按工作单元分给几个DataContext 来处理。
你也可以通过构造函数配置这些DataContext 使用相同的数据库连接,这样也可以发挥据库连接池的用途。
3. CompiledQuery --- 有必要就得用在创建一个linq to sql 表达式并将它转换成对应的sql 语句执行的过程,需要几个关键的步骤1) 创建表达式树2) 转换成sql3) 运行sql 语句4) 取回数据5) 将数据转换成对象很显然,当我们一遍又一遍的执行相同的查询时,上面1),2)两个步骤重复执行是在浪费时间。
上一篇讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ to SQL语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects、LINQ to DataSets、LINQ to SQL、LI NQ to Entities、LINQ to XML,但是相对来说LINQ to SQL在我们程序中使用最多,毕竟所有的数据都要在数据库运行着各种操作。
所以先来学习LINQ to SQL,其它的都差不多了,那么就从Select 说起吧,这个在编写程序中也最为常用。
本篇详细说明一下Select和Count/Sum/Min/Max/Avg。
Select/Distinct操作符适用场景:o(∩_∩)o… 查询呗。
说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来;延迟。
Select/Distinct操作包括9种形式,分别为简单形式、匿名类型形式、带条件形式、指定类型形式、过滤类型形式、shaped类型形式、嵌套类型形式、LocalMethodCall形式、Distinct形式。
1.简单形式:注意:这个语句只是一个声明或者一个描述,并没有真正把数据取出来,只有当你需要该数据的时候,它才会执行这个语句,这就是延迟加载(deferred loading)。
如果,在声明的时候就返回的结果集是对象的集合。
你可以使用ToList() 或ToArray()方法把查询结果先进行保存,然后再对这个集合进行查询。
当然延迟加载(deferred loading)可以像拼接SQL语句那样拼接查询语法,再执行它。
2.匿名类型形式:说明:匿名类型是C#3.0中新特性。
其实质是编译器根据我们自定义自动产生一个匿名的类来帮助我们实现临时变量的储存。
匿名类型还依赖于另外一个特性:支持根据property来创建对象。
本文实例讲述了使用LINQ to SQL连接数据库及SQL操作语句用法。
分享给大家供大家参考,具体如下:LINQ简介LINQ:语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。
它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
LINQ是一门查询语言,和SQL一样,通过一些关键字的组合,实现最终的查询。
LINQ的分类LINQ to ObjectLINQ to XMLLINQ to SQLLINQ to DataSetLINQ to 命名空间为System.Linq;LINQ查询语法:from 临时变量in 集合对象或数据库对象where 条件表达式[orderby条件][group by 条件]select 临时变量中被查询的值例:from c in Student select c;假设Student是一个数据库表对应的一个实体类则查询语句为:from c in Student select c;//整表查询from c in Student where =="张三" select c;//查询姓名为张三的所有信息其中C为临时变量,可任意取。
查询几个字段1、查询student表中的几个字段代码如下:var query=from c in student select new {c.number,,c.age};2、查询student表中的几个字段,并重新设定列名代码如下:var query=from c in student select new {学号=c.number,姓名=, 年领=c.age};注意事项linq查询语句必须以from子句开始,以select 子句结束。
Linq是在.NET Framework 3.5 中出现的技术,所以在创建新项目的时候必须要选3.5或者更高版本,否则无法使用。
LINT TO SQL增删改protected IQueryable<Products> GetQuery(decimal pId) //定制一个查询方法,返回产品id大于指定id的对象集{pdc = new LINQtoSQLDataContext();var query = from product in pdc.Productswhere product.pId > pIdselect product;return query;}protected void btnSelect_Click(object sender, EventArgs e) //查找{int id = 0;if (TextBox1.Text.Length == 0){this.TextBox1.Text = "请输入整数!";this.TextBox1.Focus();}else{id = Convert.ToInt32(TextBox1.Text);var query = GetQuery(id);if (query.Count() > 0){GridView_Show.DataSource = query;GridView_Show.DataBind();lblInfo.T ext = "查询id号大于" + id + "的记录成功";}else{lblInfo.T ext = "不存在满足条件的记录";}}}protected void btnUpdate_Click(object sender, EventArgs e) //更新{try{int id = 0;if (this.TextBox2.Text.Length == 0){this.TextBox2.Text = "请输入数字!将增大productId字段";this.TextBox2.Focus();}else{id = Convert.ToInt32(TextBox2.Text);foreach (Products prod in GetQuery(1)){prod.ProductId += (int)id;}pdc.SubmitChanges();GridView_Show.DataSource = GetQuery(0);GridView_Show.DataBind();lblInfo.T ext = "把ProductId增加了" + id;}}catch{lblInfo.T ext = "执行失败!";}}protected void btnInsert_Click(object sender, EventArgs e) //插入{pdc = new LINQtoSQLDataContext();Products newproduct = new Products();//int id = Convert.ToInt32(TextBox3.Text);//newproduct.pId = id; 不能给主键赋值,赋值无效newproduct.ProductId = 1;newproduct.ProductName = "橙子";newproduct.ProductSupplierId = 1;pdc.Products.InsertOnSubmit(newproduct); //插入一条记录pdc.SubmitChanges();GridView_Show.DataSource = GetQuery(0);GridView_Show.DataBind();lblInfo.T ext = "插入一条记录成功!";}protected void btnDelete_Click(object sender, EventArgs e) //删除{pdc = new LINQtoSQLDataContext();int id = Convert.ToInt32(this.T extBox4.Text);IEnumerable<Products> query = from product in pdc.Products //查询数据库中满足条件的数据集where product.ProductSupplierId == idselect product;pdc.Products.DeleteAllOnSubmit(query); //一次删除一批记录pdc.SubmitChanges(); //提交与正式执行更改申请//Single()和SingleOrDefault()都只返回一条记录,前者在没有记录的情况下会抛出一个InvalidOperationnException的异常,//后者只是简单地返回一个默认值//Products pro = pdc.Products.SingleOrDefault(t => t.pId == id);//pdc.Products.DeleteOnSubmit(pro); //一次只能删除一条记录//lblInfo.Text = "删除id号为" + id + "的记录成功!";//重新绑定到GridView_Show中GridView_Show.DataSource = from product in pdc.Productsselect product;GridView_Show.DataBind();}。
一步一步学Linq to sql(九):其它补充
外部映射文件
我们可以使用sqlmetal命令行工具来生成外部映射文件,使用方法如下:
1、开始菜单-》 VS2008 -》VS工具-》VS2008命令行提示
2、输入命令:
3、这样,我们就可以在C盘下得到一个xml映射文件和C#的实体类代码
4、把.cs文件添加到项目中来(放到App_Code目录),然后使用下面的代码加载映射文件:
5、现在就可以照常进行其它工作了。
使用sqlmetal可以很方便的同步数据库与实体和映射文件。
每次修改数据库结构,从dbml设计器上删除表、存储过程然后再重新添加也是很麻烦的事情。
处理空值
代码执行后捕获到下面的SQL被执行:
已编译查询
对于一些在项目中经常被用到的查询可以封装成已编译查询,这样就能提高执行效率:
调用查询方式如下:
获取一些信息
上面的代码执行结果如下:
撤销提交
上面的代码执行效果如下:
批量操作
下面的代码会导致提交N次DELETE操作:
应该使用sql语句进行批操作:
对于批量更新操作也是同样道理。
本文将会不断补充其它点滴。
最后一篇将会结合分层分布式应用给出一个实际的项目。