第三章LINQ TO SQL高级查询
图文结合教你用好LINQ to SQL

不过谈到.NET平台,ORM框架似乎相对混乱了点。
很多朋友问我的时候,往往会这样问:NHibernate、NBear和Castle该选择哪个?而当我反问:为什么不适用微软自带的Linq to SQL 呢?对方经常会迷茫和不解。
我觉得这是个很奇怪的现象。
依照我个人的实践,我认为当需要快速构建一个中小型项目时,Linq to SQL是一个很好的选择。
你至少有以下理由可以选择它:i. 它是微软自己的产品,和.NET平台有着天生的适应性。
如果你使用.NET Framework3.5和 VS2008开发环境,它本身就集成在里面了,同时VS2008对于Linq to SQL 给予了诸多方便的支持。
使用它,你不仅在开发和部署时不用考虑第三方库,更可以尽情享受VS2008带来的种种方便。
ii. 上手十分容易,使用十分轻松,通常,你不需要编写一行代码,也不用写任何XML 配置,完全通过可视化拖拽就能完成ORM层的构建。
iii. 功能丰富,使用便捷。
当轻松构建好ORM层后,你就可以更轻松的操纵数据库了。
Linq to SQL提供了丰富的功能,完全可以满足日常数据访问的需求。
使用方法也非常简单、灵活。
有这么好的理由,我真想不通为什么那么多人不愿去选择它。
我想来想去,也许有两个重要原因,一是把LINQ和Linq to SQL混为一谈了,二是受前段时间“LINQ已死”的误导,觉得微软已经抛弃Linq to SQL了。
关于这两点,我就不细说了,简略澄清一下:首先,LINQ是从.NET Framework3.0开始,.NET平台上引入的一种新式语言特性,狭义一点,你可以讲它理解成一种新式语法,主要是针对迭代数据操作的,所以,也许LINQ 叫做“数据迭代引擎(Data Iterative Engine)”更合适,之所以不着样命名,我想微软可能不愿意让自己产品的简写为“DIE”吧。
:-)而Linq to SQL是LINQ在数据库访问方面的一个应用框架,完全是两码事。
一步一步学Linq to sql

意义不是很大,纯粹解决机械劳动。编译器自动为你生成get、set操作以及字段,并且你不能使用字段也不能自定义get、set操作,不过你可以分别定义get和set的访问级别。
对象初始化器
publicclassPerson
{
publicstringusername {get;set; }
Table<Customer> Customers = ctx.GetTable<Customer>();
GridView1.DataSource =fromcinCustomerswherec.CustomerID.StartsWith("A")selectnew{顾客ID=c.CustomerID,顾客名=,城市=c.City};
Console.WriteLine("username:{0} age:{1}", ername, data.age);
匿名类型允许开发人员定义行内类型,无须显式定义类型。常和var配合使用,var用于声明匿名类型。定义一个临时的匿名类型在LINQ查询句法中非常常见,我们可以很方便的实现对象的转换和投影。
今天就说到这里,再见!
DataContext与实体
DataContext
DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。
DataContext提供了以下一些使用的功能:
?以日志形式记录datacontext生成的sql?执行sql包括查询和更新语句?创建和删除数据库datacontext是实体和数据库之间的桥梁那么首先我们需要定义映射到数据表的实体
linq转化为sql语句的方法

linq转化为sql语句的方法Linq转化为SQL语句的方法概述Linq(Language Integrated Query)是微软推出的一种用于查询和操作数据的统一编程模型。
它可以在不同的数据源上执行查询,例如关系型数据库、XML文档等。
在开发过程中,我们常常需要将Linq 表达式转化为相应的SQL语句,以便对数据库进行操作。
本文将详细介绍多种将Linq转化为SQL语句的方法。
1. LINQ to SQL基本概念LINQ to SQL是一种将LINQ查询转化为SQL语句的方法。
它是Entity Framework的一部分,提供了一种直接在.NET应用程序中使用对象来表示和操作关系型数据库的方式。
在LINQ to SQL中,可以通过DataContext对象来执行查询,并将查询结果转化为SQL语句。
示例代码using System;using ;using ;public class Program{public static void Main(){// 创建DataContext对象,连接数据库DataContext context = new DataContext("Data Sour ce=.;Initial Catalog=MyDatabase;Integrated Security=True ");// 创建查询表达式var query = from c in <Customer>()where == "Beijing"select c;// 执行查询并获取SQL语句string sql = (query).CommandText;// 输出SQL语句(sql);}}2. Entity Framework基本概念Entity Framework是微软推出的一种对象关系映射(ORM)工具,可以映射.NET对象与数据库中的表、视图等关系。
使用LINQ to SQL访问数据库

Copyright@2009 College of ITSoft (HDU)
Version No: 2.0
16
使用Object Relational Designer创建实体 1. 选择站点的添加新项 2. 选择LINQ to SQL类 3. 打开Object Relational Designer后将一个或多 个表拖放至Designer面板上
Copyright@2009 College of ITSoft (HDU)
Version No: 2.0
14
手工创ቤተ መጻሕፍቲ ባይዱ实体
using System.Data.Linq.Mapping; [Table] public class TempInfo { [Column (IsPrimaryKey=true)] public string uID { get; set; } [Column(IsPrimaryKey=true)] public DateTime cDate { get; set; } [Column] public double TempAM { get; set; } [Column] public double TempPM { get; set; } [Column] public string Des { get; set; } }
Copyright@2009 College of ITSoft (HDU)
Version No: 2.0
11
C#语言中的子句 语言中的子句
from 指定数据源以及用来迭代数据源的变量 where 过滤查询的结果 select 指定查询结果中的项 group 通过某一关键字对相关的值进行聚合 into 存储聚合中的结果,或连接到一个临时变 量 orderby将查询结果按升序或降序进行排序 join 通过一个关键字,对两个数据源进行连接 let 创建一个临时变量,来表示子查询的结果
LINQ to SQL 数据上下文

LINQ to SQL 数据上下文1. 概述通过LINQ to SQL基础篇我们对LINQ to SQL有了一个概要的认识,本文我们来认识在LINQ to SQL 中处于非常重要地位的一个对象——DataContext(数据上下文),它位于System.Data.Linq命名空间下,是实体和数据库之间的一个桥梁。
DataContext主要提供了如下几个功能:A.记录生成的SQL语句,这对于我们调试LINQ to SQL时是非常有用的,可以通过查看记录的SQL语句,来分析LINQ to SQL在数据库中执行了什么。
B.执行SQL语句。
LINQ to SQL通过查询句法和Lambda表达式提供了强大的功能,能完成T-SQL 90%以上的功能,如果在开发中,遇到非常复杂的查询,无法用查询句法或者Lambda表达式来实现,你可以使用自己熟悉的T-SQL来完成。
C.创建、删除数据库。
在第一篇中我就说过,LINQ to SQL是一个轻量级的O/R Mapping,使用LINQ to SQL可以不用考虑数据库表之间的关系,直接考虑你的业务对象关系,设计好实体类之后,通过DataContext可以自动创建数据库。
2. 创建DataContext在DataContext中,提供了如下四种重载方式的构造函数,就是说我们可以通过四种方式来创建一个DataContext对象:Code1:public DataContext(IDbConnection connection);public DataContext(string fileOrServerOrConnection);public DataContext(IDbConnection connection, MappingSource mapping);public DataContext(string fileOrServerOrConnection, MappingSource mapping);我们经常使用的有两种:一是使用连接字符串,作为DataContext构造函数的参数:Code2public DataContext CreateDataContext(){DataContext db = new DataContext(@"Server=Esint-lhj\Sql2005;User Id=sa;Password=sql2005;Database=MSPetShop4");return db;}这里为了避免硬编码连接字符串,你也可以把连接字符串放在配置文件中。
第三章LINQ TO SQL高级查询

•
高级查询
– –
增删改方式 • • • 增加数据
– – – 一个对象,一对多
删除数据
一个对象,主从关系
更新数据
一个对象,多条记录,多表更新
增删改方式
新增数据
– –
一个对象 一对多
新增方式 新增一个对象:
var stu = new Model.stuInfo { stuNo="s25308", stuName="足下 足下", 足下 stuAge=20, stuSex="男", 男 stuClass=2 }; //保存到对象集合 保存到对象集合 db.stuInfo.InsertOnSubmit(stu); db.SubmitChanges();
从数据库中删除一个对象
//从表 从表 var stu = from s in db.stuInfo 增删改方式 where s.stuClass == 3 select s; 删除主从表条: //主表 主表 var classic = db.classic.First(c => c.classID == 3); //先删除从表数据 先删除从表数据 foreach (var s in stu) { //先删除学生成绩表对应学号的学生 先删除学生成绩表对应学号的学生 var score = (from sc in db.stuMarks where先删除从表数据,再删除主表数据 sc.stuNo == s.stuNo select sc).First(); db.stuMarks.DeleteOnSubmit(score); db.stuInfo.DeleteOnSubmit(s); } //在删除主表 在删除主表 db.classic.DeleteOnSubmit(classic); //提交 提交 db.SubmitChanges();
LINQ TO SQL 连接查询与联合查询

LINQ TO SQL 连接查询与联合查询Join操作适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等。
对各个表之间的关系,就用这些实现对多个表的操作。
说明:在Join操作中,分别为Join(Join查询), SelectMany(Select一对多选择)和Gro upJoin(分组Join查询)。
该扩展方法对两个序列中键匹配的元素进行inner join操作SelectMany说明:我们在写查询语句时,如果被翻译成SelectMany需要满足2个条件。
1:查询语句中没有join和into,2:必须出现EntitySet。
在我们表关系中有一对一关系,一对多关系,多对多关系等,下面分别介绍一下。
1.一对多关系(1 to Many):语句描述:Customers与Orders是一对多关系。
即Orders在Customers类中以Enti tySet形式出现。
所以第二个from是从c.Orders而不是db.Orders里进行筛选。
这个例子在From子句中使用外键导航选择伦敦客户的所有订单。
语句描述:这一句使用了p.Supplier.Country条件,间接关联了Supplier表。
这个例子在Where子句中使用外键导航筛选其供应商在美国且缺货的产品。
生成SQL语句为:2.多对多关系(Many to Many):说明:多对多关系一般会涉及三个表(如果有一个表是自关联的,那有可能只有2个表)。
这一句语句涉及Employees, EmployeeTerritories, Territories三个表。
它们的关系是1:M:1。
Employees和Territories没有很明确的关系。
语句描述:这个例子在From子句中使用外键导航筛选在西雅图的雇员,同时列出其所在地区。
这条生成SQL语句为:3.自联接关系:语句描述:这个例子在select 子句中使用外键导航筛选成对的雇员,每对中一个雇员隶属于另一个雇员,且两个雇员都来自相同城市。
sql 高级查询总结

sql 高级查询总结SQL高级查询总结在SQL中,高级查询是指使用复杂的语法和特殊的操作符来满足特定的查询需求。
下面是SQL高级查询的一些常见技巧和用法:1. 子查询:子查询是将一个查询结果作为另一个查询的输入。
它可以用在WHERE子句、FROM子句或SELECT子句中。
通过使用子查询,我们可以在同一语句中完成多个查询。
2. 联结:联结是将两个或多个表中的数据按照指定的关联条件进行连接。
常见的联结类型有内联结、外联结和自然联结。
联结可以用来获取多个表中的相关信息,并且可以根据需要进行过滤、排序和分组。
3. 窗口函数:窗口函数是一种高级的聚合函数,它可以在查询结果上进行计算,并返回计算结果。
窗口函数可以在分组查询的基础上,对每个分组中的数据进行更复杂的操作,例如排序、排名和累计计算。
4. 常用函数:SQL提供了许多内置函数,用于处理和转换数据。
一些常见的函数包括聚合函数(SUM、AVG、MAX、MIN等)、字符串函数(CONCAT、SUBSTRING、LENGTH等)、日期函数(DATE、TIME、YEAR等)和数学函数(ABS、ROUND、FLOOR等)。
5. 条件逻辑:使用CASE语句可以实现条件逻辑,根据不同的条件返回不同的结果。
CASE语句可以在SELECT子句、WHERE子句和ORDER BY子句中使用,用于根据不同的条件进行分支判断。
6. 索引优化:为了改善查询性能,可以使用索引来加速检索过程。
通过在关键列上创建索引,可以减少查询时需要扫描的行数,从而提高查询效率。
需要根据具体情况选择合适的索引类型和优化策略。
总结:通过掌握SQL高级查询的技巧和用法,可以更灵活地处理复杂的查询需求。
使用子查询、联结、窗口函数和条件逻辑可以实现更精确和高效的数据查询和操作。
合理使用索引和优化查询语句的性能可以提高数据库的效率和响应速度。
熟练掌握这些高级查询的方法,对于开发人员和数据库管理员来说是非常重要的技能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从数据库中删除一个对象
//从表 从表 var stu = from s in db.stuInfo 增删改方式 where s.stuClass == 3 select s; 删除主从表条: //主表 主表 var classic = db.classic.First(c => c.classID == 3); //先删除从表数据 先删除从表数据 foreach (var s in stu) { //先删除学生成绩表对应学号的学生 先删除学生成绩表对应学号的学生 var score = (from sc in db.stuMarks where先删除从表数据,再删除主表数据 sc.stuNo == s.stuNo select sc).First(); db.stuMarks.DeleteOnSubmit(score); db.stuInfo.DeleteOnSubmit(s); } //在删除主表 在删除主表 db.classic.DeleteOnSubmit(classic); //提交 提交 db.SubmitChanges();
增删改方式
删除数据
– –
一个对象 主从关系
删除方式 删除一个对象:
//一条记录 一条记录 var stu = db.stuInfo.First(s => s.stuNo == "s25310"); db.stuInfo.DeleteOnSubmit(stu); db.SubmitChanges();
注册输出参数
无参直接调用 输入参数调用 输入/输出参数
总结 • 连接查询的几种方式
一对多、多对多、双向连接、 一对多、多对多、双向连接、左连接
•
新增数据的执行方法
InsertOnSubmit(对象 对象) 对象
•
Linq调用存储过程怎么处理输出参数
使用ref注册输出参数 并用查询示例
多对多关系(Many to Many):
var q = from c in db.Customers join o in db.Orders on c.CustomerID equals o.CustomerID into orders select new { c.ContactName, OrderCount = orders.Count() };
增删改方式
更新数据
– – –
一个对象 多条记录 多表查询更新
更新方式 更新一个对象:
var stu = db.stuInfo.First(s => s.stuNo == "s25301"); stu.stuName = "陈兰 陈兰"; 陈兰 db.SubmitChanges();
从数据库中更新一个对象
小结 • 连接查询
– – – – 一对多(1 to Many):表关系一对多关系 多对多(Many to Many):表关系多对多关系 双向连接(Two way join):显式联接两个表并从 这两个表投影出结果 左外部连接(Left Outer Join):获取左外部表联接 分组查询(Group By/Having操作符):分组数据, 为我们查找数据缩小范围。 子查询(Contains):连接不同的集合,不会自动 过滤相同项
– 分组查询,子查询
高级查询
连接查询方式
– –
一对多 多对多
连接查询示例 一对多关系(1 to Many):
var q =
from c in db.Customers from o in c.Orders where c.City == "London" select o; 语句描述:Customers与Orders是一对多关系。 即Orders在Customers类中以EntitySet形式出现。 所以第二个from是从c.Orders而不是db.Orders里 进行筛选。这个例子在From子句中使用外键导航 选择伦敦客户的所有订单。
建立程序,使用linq实现下面题目 数据库使用上章作业数据库 通过linq实现 通过 查询stuInfo表、classic表显示效果如下图 实现 删除功能 实现删除按钮功能 通过连接查询
显示班级名称
第三章 第三章
LINQ TO SQL高级查询 高级查询
回顾 • LINQ主要负责数据库的查询的是哪部分
LINQ to
•
LINQ查询存在的两种形式
查询方法方式、查询语句方式
•
举例常用的聚合类查询方法
Count、Max/Min、Average
本章任务 • 编写 LINQ程序,通过实现下图
从数据库中查询要更新的对象 进行更新
小结 • 增删改提交方法
– 新增数据提交使用 db.stuInfo.InsertOnSubmit(stu); db.SubmitChanges(); – 删除数据使用 db.stuInfo.DeleteOnSubmit(stu); db.SubmitChanges(); – 更新数据使用 db.SubmitChanges();
向数据库中添加一个对象
新增方式 //一对多关系 一对多关系 var c = new Model.classic 新增1对多对象: { className="T120" }; var s = new Model.stuInfo { stuNo = "s25310", stuName = "王军 王军", 王军 stuAge = 24, stuSex = "男", 男 classic 一对多关系一次插入多个对象 = c //对应添加的班级对象 对应添加的班级对象 }; var sc = new Model.stuMarks { ExamNo = "S271817", LabExam=70, writtenExam=80 stuInfo = s //对应添加的学生对象 对应添加的学生对象 }; db.classic.InsertOnSubmit(c); db.SubmitChanges();
从数据库中更新多个对象
更新方式 多表查询更新:
var sql = from sc in db.stuMarks where sc.stuInfo.stuName == "陈兰 陈兰" 陈兰 select sc; foreach (var s in sql) { s.writtenExam += 5; } db.SubmitChanges();
高级查询方式示例 子查询(Contains):
var q = ( from o in db.Orders where ( new string[] { "AROUT", "BOLID", "FISSA" }) .Contains(o.CustomerID) select o).ToList();
语句描述:查找"AROUT", "BOLID" 和 "FISSA" 这三个客户的订单。先定义了一个数组,在LINQ to SQL中使用Contains,数组中包含了所有的 CustomerID,即返回结果中,所有的CustomerID 都在这个集合内。也就是in。
更新方式 更新多条记录:
var sql = from s in db.stuInfo where s.stuClass == 1 select s; foreach (var s in sql) { s.stuAge += 1; //年龄加一岁 年龄加一岁 } db.SubmitChanges();
– –
分组查询 子查询
高级查询方式示例 分组查询(Group By操作符):
var q = from p in db.Products group p by p.CategoryID into g select g;
说明:from p in db.Products 表示从表中将产品 对象取出来。group p by p.CategoryID into g表示 对p按CategoryID字段归类。其结果命名为g,一 旦重新命名,p的作用域就结束了,所以,最后 select时,只能select g。
多对多关系一般会涉及三 个表(如果有一个表是自关 联的,那有可能只有2个表)。 这一句语句涉及 Employees, EmployeeTerritories, Territories三个表。它们的 关系是1:M:1。 Employees和Territories没 有很明确的关系。
高级查询
高级查询方式
通过linq实现 实现 通过 删除功能 通过连接查询 显示班级名称
本章目标
– – – 学习理解 LINQ to SQL 高级查询 学习LINQ to SQL句增删改语句 学习LINQ to SQL使用存储过程
高级查询方式 高级查询方式 • 连接查询
– 一对多,多对多,双向连接,左外部连接
•
高级查询
•
高级查询
– –
增删改方式 • • • 增加数据
– – – 一个对象,一对多
删除数据
一个对象,主从关系
更新数据
一个对象,多条记录,多表更新
增删改方式
新增数据
– –
一个对象 一对多
新增方式 新增一个对象:
var stu = new Model.stuInfo { stuNo="s25308", stuName="足下 足下", 足下 stuAge=20, stuSex="男", 男 stuClass=2 }; //保存到对象集合 保存到对象集合 db.stuInfo.InsertOnSubmit(stu); db.SubmitChanges();