收藏 分享(赏)

LINQ_TO_SQL.doc

上传人:dzzj200808 文档编号:2998249 上传时间:2018-10-01 格式:DOC 页数:164 大小:2.23MB
下载 相关 举报
LINQ_TO_SQL.doc_第1页
第1页 / 共164页
LINQ_TO_SQL.doc_第2页
第2页 / 共164页
LINQ_TO_SQL.doc_第3页
第3页 / 共164页
LINQ_TO_SQL.doc_第4页
第4页 / 共164页
LINQ_TO_SQL.doc_第5页
第5页 / 共164页
点击查看更多>>
资源描述

1、LINQ 体验系列文章导航LINQ 推荐资源推荐一个大家学习和交流 LINQ 的地方,就是博客园的 LINQ 专题 和 LINQ 交流小组。 LINQ 专题中整理了有关 LINQ 方方面面的入门、进阶、深入的文章;学习中遇到什么问题或者疑问也可以 LINQ 交流小组去提问,往往你会得到意想不到的收获哦。LINQ 专题:http:/ 小组:http:/ 导言 在 2007 年 11 月 19 日,微软发布了 Visual Studio 2008 和.NET 3.5。带来了很多新东西,比如ASP.NET3.5、LINQ、Silverlight、ASP.NET 3.5 Extensions 等等,我

2、们要跟紧着微软的步伐,很多的东西不得不从头开始学习了。本系列共三部分,第一部分讲述了 Visual Studio 2008 新特性,第二部分介绍了 C# 3.0 新语言特性和改进。第三部分开始讲解 LINQ,先整体介绍了 LINQ,再从 LINQ to SQL 语句入手贯穿了 LINQ 的精髓。本文给出了本系列的导航。第一部分:Visual Studio 2008 新特性导读:Visual Studio 2008 的新特性,其包括.NET Framework 对重定向的支持; ASP.NET AJAX 和JavaScript 智能客户端支持;全新的 Web 开发新体验:Web 设计器提供了分割

3、视图编辑、嵌套母板页、以及强大的 CSS 编辑器集成;编程语言方面的改进和 LINQ;浏览.NET Framework 库源码;智能部署ClickOnce;.NET Framework 3.5 增强功能;集成对 Office (VSTO)和 Sharepoint 2007 开发的支持;在Windows Server 2008, Windows Vista 和 Microsoft Office 2007 下最好的开发工具集;单元测试功能,所有的 Visual Studio 专业版本都支持单元测试功能等等。 LINQ 体验(1) Visual Studio 2008 新特性第二部分:C# 3.0

4、新语言特性和改进导读:总体来说,Visual Studio 2008 和.NET 3.5 是建立在.NET2.0 核心的基础之上,C# 3.0 新语言特性在.NET2.0 基础上进行了改进,这些改进的功能可以大大简化我们编写程序。C# 3.0 新语言特性和改进包括: 自动属性(Auto-Implemented Properties) 隐含类型局部变量(Local Variable Type Inference) 匿名类型(Anonymous Types) 对象与集合初始化器(Object and Collection Initializers) 扩展方法(Extension Methods)

5、Lambda 表达式和Lambda 表达式树 (Lambda Expression and Lambda Expression Trees) LINQ 体验(2) C# 3.0 新语言特性和改进(上篇)LINQ 体验(3) C# 3.0 新语言特性和改进 (下篇)第三部分:LINQ 带来的编程体验导读:语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。首先整体认识一下 LINQ,然后从 LINQ to SQL 语句由基础到高级贯穿了 LINQ 的精髓。LINQ 简 介L

6、INQ 体验(4) LINQ 简介和 LINQ to SQL 语句之 WhereLINQ to SQL 语 句 基 本 查 询 操 作 部 分LINQ 体验(5) LINQ to SQL 语句之 Select/Distinct 和 Count/Sum/Min/Max/AvgLINQ 体验(6) LINQ to SQL 语句之 Join 和 Order ByLINQ 体验(7) LINQ to SQL 语句之 Group By/Having 和 Exists/In/Any/All/ContainsLINQ 体验(8) LINQ to SQL 语句之 Union All/Union/Interse

7、ct 和 Top/Bottom 和 Paging 和SqlMethodsLINQ 体验(9) LINQ to SQL 语句之 Insert/Update/Delete 操作LINQ to SQL 语 句 高 级 部 分LINQ 体验(10) LINQ to SQL 语句之开放式并发控制和事务LINQ 体验(11) LINQ to SQL 语句之 Null 语义和 String/DateTime 方法LINQ 体验(12) LINQ to SQL 语句之对象标识和对象加载LINQ 体验(13) LINQ to SQL 语句之运算符转换和 ADO.NET 与 LINQ to SQL LINQ 体验

8、(14) LINQ to SQL 语句之存储过程LINQ 体验(15) LINQ to SQL 语句之用户定义函数LINQ 体验(16) LINQ to SQL 语句之 DataContextLINQ 体验(17) LINQ to SQL 语句之动态查询LINQ 体验(18) LINQ to SQL 语句之视图和继承支持LINQ 学习工具LINQPad :LINQPad 是一个很好的学习 LINQ 的工具,LINQPad 是完全免费的,无需安装,支持 C# 3.0 和 Framework 3.5 的全部功能VLinq :Visual Linq Query Builder(LINQ 可视化查询编

9、辑器)作为 Visual Studio 2008 的一个插件,可以帮助我们在程序中创建 LINQ to SQL 查询表达式,支持 C#和 VB 两种语言。LINQ in Action 电子书:作者:Fabrice Marguerie, Steve Eichert, Jim Wooley 出版日期:2008 年 1 月15 日 结束语花了时间把这个系列全部更新了,以适应新的模板,采用图文并茂形式全面介绍了 LINQ to SQL 。通过这个系列,您可以迅速入门 LINQ。LINQ 体 验 (1)Visual Studio 2008 新 特 性一、写本系列的目的二、Visual Studio 20

10、08 和.NET 3.5 总体认识在 2007 年 11 月 19 日,微软发布了 Visual Studio 2008 和.NET 3.5,具体见这里。你可以在这里下载Visual Studio Team Suite 2008 的 90 天免费试用版本。.NET Framework 3.5 总体框架图VS 2008 private string _name;private int _age;public int Idget return _id; set _id = value; public string Nameget return _name; set _name = value; p

11、ublic int Ageget return _age; set _age = value; 现在,可以这样简化:public class Userpublic int Id get; set; public string Name get; set; public int Age get; set; 像上面这样的空的 get/set 属性的话,它会自动为你在类中生成一个私有成员变量,对这个变量实现一个公开的 getter 和 setter。我们可以使用.NET 开发环境所提供的 ildasm.exe(IL 代码反汇编器)工具来分析程序集或者模块的内容。我就不贴图了。隐含类型局部变量(Loc

12、al Variable Type Inference)C#3.0 引进了 var 这个新关键字,在声明局部变量时可用于替代原先的类型名,即当一个变量声明标识为var 类型并且该范围域中没有 var 名称类型存在,那么这个声明就称为隐含类型局部变量。如下(等同于/后面的显式声明):var i = 5;/intvar j = 23.56;/doublevar k = “C Sharp“;/stringvar x;/错误var y = null;/错误var z = 1, 2, 3 ;/错误在调试状态下,编译器解释如下隐含类型局部变量要点1. var 为关键字,可以根据后面的初始化语句自动推断类型,

13、这个类型为强类型。 2. 初始化语句必须为表达式,不可以为空。且编译时可以推断类型。一旦初始化之后,只可以存储这种类型。 3. var 声明的仅限于局部变量,不可用于字段。亦可以用于 for,foreach,using 等语句中。 4. 数组也可以作为隐含类型。 5. 初始化语句不能是一个自身的对象或者集合初始化器,但是他可以是包含一个对象或者初始化器的一个 new 表达式。 6. 如果局部变量声明包含了多个声明符,其类型必须相同。 匿名类型(Anonymous Types)匿名类型允许定义行内类型,无须显式定义类型。常和 var 配合使用来声明匿名类型。var p1 = new Id = 1

14、, Name = “YJingLee“, Age = 22 ;/属性也不需要申明var p2 = new Id = 2, Name = “XieQing“, Age = 25 ;p1 = p2;/p1,p2 结构相同,可以互相赋值在这里编译器会认为 p1,p2 相当于:public class SomeTypepublic int Id get; set; public string Name get; set; public int Age get; set; 那么数组怎么定义呢?使用“new“关键字来声明数组,加上数组的初始值列表。像这样:var intArray = new 2, 3,

15、5, 6 ;var strArray = new “Hello“, “World“ ;var anonymousTypeArray = new new Name = “YJingLee“, Age = 22 , new Name = “XieQing“, Age = 25 ;var a = intArray0;var b = strArray0;var c = anonymousTypeArray1.Name;匿名类型要点1. 可以使用 new 关键字调用匿名初始化器创建一个匿名类型的对象。 2. 匿名类型直接继承自 System. Object。 3. 匿名类型的成员是编译器根据初始化器推断

16、而来的一些读写属性。 对象与集合初始化器(Object and Collection Initializers)对象初始化器 (Object Initializers) :.NET2.0 框架中的类型非常依赖于属性。当生成对象实例和使用新的类型时,在.Net2.0 时候我们像这样写:User user = new User();user.Id = 1;user.Name = “YJingLee“;user.Age = 22;在 VS2008 中,编译器会自动地生成合适的属性 setter 代码,使得原来几行的属性赋值操作可以在一行完成。我们可以这样简化:像这样,对象初始化器由一系列成员对象组成

17、,其对象必须初始化,用逗号间隔,使用封闭。User user = new User Id = 1, Name = “YJingLee“, Age = 22 ;又例如,我把二个人加到一个基于泛型的类型为 User 的 List 集合中:List user = new Listnew UserId=1,Name=“YJingLee“,Age=22,new UserId=2,Name=“XieQing“,Age=25,;如果有相同名字和类型的两个对象初始化器将会产生相同的实例,可以相互赋值。例如:User user = new User Id = 1, Name = “YJingLee“, Age

18、= 22 ;User user2 = new User Id = 2, Name = “XieQing“, Age = 25 ;user = user2; 除了在初始化类时设置简单的属性值外,对象初始化器特性也允许我们设置更复杂的嵌套(nested) 属性类型。例如我们可以在上面定义的 User 类型同时拥有一个属于 Address 类型的叫“Address”的属性:User user = new UserId = 1,Name = “YJingLee“,Age = 22,Address = new AddressCity = “NanJing“,Zip = 21000;集合初始化器(Coll

19、ection Initializers):集合初始化器由一系列集合对象组成,用逗号间隔,使用封闭。集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为 int 的 List 集合中List num = new List 0, 1, 2, 6, 7, 8, 9 ;对象与集合初始化器要点1. 对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。 2. 对象初始化器允许只给一部分属性赋值,包括 internal 访问级别 3. 对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。 4.

20、集合初始化器会对初始化器中的元素进行按序调用 ICollection.Add(T)方法。 5. 注意对象初始化器和集合初始化器中成员的可见性和调用顺序。 6. 对象与集合初始化器同样是一种编译时技术。 LINQ 体 验 (3)C# 3.0 新 语 言 特 性 和 改 进 (下 篇 )上一篇我们介绍了 C# 3.0 新语言特性和改进上部分,这篇我们继续介绍剩下的部分。C# 3.0 新语言特性和改进包括: 自动属性(Auto-Implemented Properties) 隐含类型局部变量(Local Variable Type Inference) 匿名类型(Anonymous Types) 对

21、象与集合初始化器(Object and Collection Initializers) 扩展方法(Extension Methods) Lambda 表达式和Lambda 表达式树 (Lambda Expression and Lambda Expression Trees) 扩展方法(Extension Methods)往往我们需要对 CLR 类型进行一些操作,但苦于无法扩展 CLR 类型的方法,只能创建一些 helper 方法,或者继承类。我们来修改上面的 User 类:public class Userpublic int Id get; set; public string Name

22、 get; set; public int Age get; set; public string Read()return “Id:“ + Id + “姓名:“ + Name + “年龄:“ + Age;然后调用var user = new Id = 1, Name = “YJingLee“, Age = 22 ;var str = user.Read();现在有了扩展方法就方便多了。扩展方法允许开发人员往一个现有的 CLR 类型的公开契约(contract)中添加新的方法,而不用生成子类或者重新编译原来的类型。扩展方法有助于把今天动态语言中流行的对 duck typing 的支持之灵活性,

23、与强类型语言之性能和编译时验证融合起来。 引用 Scott 博文扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,使得附加的方法扩展已存在类型和构造类型成为可能。他可以对现有类功能进行扩充,从而使该类型的实例具有更多的方法(功能)。扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。扩展方法给我们一个怎样的思路呢?我们一步一步做一下!首先声明扩展方法:通过指定关键字 this 修饰方法的第一个参数。注意扩展方法仅可声明在静态类中。扩展方法具备所有常规静态方法的所有能力,可以使用实例方法语法来调用。接着就可以调用扩展方法了。下面通过一个具体的实例分析一下:例

24、如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0 框架下像这样:var email = ““;if (EmailValidator.IsValid(email)Response.Write(“YJingLee 提示: 这是一个正确的邮件地址“);而使用扩展方法的话,我可以添加“IsValidEmailAddress()”方法到 string 类本身中去,该方法返回当前字符串实例是否是个合法的字符串。if (email.IsValidEmailAddress()Response.Write(“YJingLee 提示: 这是一个正确的邮件地址“);我们是怎么把这个 IsVali

25、dEmailAddress()方法添加到现有的 string 类里去的呢?先定义一个静态类,再定义“IsValidEmailAddress”这个静态的法来实现的。public static class Extensions/静态类public static bool IsValidEmailAddress(this string s)/静态方法和 thisRegex regex = new Regex(“w-.+(w-+.)+w-2,4$“);return regex.IsMatch(s);注意,上面的静态方法在第一个类型是 string 的参数变量前有个“this”关键词,这告诉编译器,这个

26、特定的扩展方法应该添加到类型为“string”的对象中去。然后在 IsValidEmailAddress()方法实现里,我可以访问调用该方法的实际 string 实例的所有公开属性 /方法/事件,取决于它是否是合法电子邮件地址来返回true/false。扩展方法不仅能够应用到个别类型上,也能应用到.NET 框架中任何基类或接口上。即可用于整个 .NET 框架丰富的可组合的框架层扩展。扩展方法要点1. 扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。 2. 扩展方法的作用域是整个 namespace 可见的,并且可以通过 using

27、 namespace 来导入其它命名空间中的扩展方法。3. 扩展方法的优先级:现有实例方法优先级最高,其次为最近的 namespace 下的静态类的静态方法,最后为较远的 namespace 下的静态类的静态方法。4. 扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。 Lambda 表达式和 Lambda 表达式树 (Lambda Expression and Lambda Expression Trees)Lambda 表达式我们从“所有字符串查找包含 YJingLee 子字符串”说起。在 C# 2.0 中,匿名方法允许我们以内联的方式来实现委托实例,它提供强大的函数式

28、编程语言,但是标记显得相当的冗长和带有强制性。我们使用 C# 2.0 中的匿名方法查找,代码如下:var inString = list.FindAll(delegate(string s) return s.Indexof(“YJingLee“) = 0; );现在可以使用 C# 3.0 带来的 Lambda 表达式允许我们使用一种更接近人的思维、更自然的方式来实现类似于匿名方法同样的效果,看下面的代码多么简洁:var inString = list.FindAll(s = s.Indexof(“YJingLee“) = 0);Lambda 表达式格式:(参数列表)=表达式或语句块具体意义:

29、定义 Lambda 接受参数列表,运行表达式或语句块返回表达式或语句块的值传给这个参数列表。Lambda 表达式参数类型可以是隐式类型或显式类型。在显式列表中,每个参数的类型是显式指定的,在隐式列表中,参数的类型由 Lambda 表达式出现的语境自动推断类型。Lambda 表达式的参数列表可以有一个或多个参数,或者无参数。在有单一的隐型参数的 lambda 表达式中,圆括号可以从参数列表中省略。例如:(x, y) = x * y;/多参数,隐式类型=表达式x = x * 10;/单参数,隐式类型= 表达式x = return x * 10; ; /单参数,隐式类型=语句块(int x) = x

30、 * 10;/单参数,显式类型=表达式(int x) = return x * 10; ;/单参数,显式类型= 语句块() = Console.WriteLine(); /无参数下面看这个例子:在前面的帖子中,我们写了一个 User 类及增加了 2 个人,接下来,我们使用由 LINQ 提供的新的 Where和 Average 方法来返回集合中的人的一个子集,以及计算这个集合中的人的平均年龄:List user = new Listnew UserId=1,Name=“YJingLee“,Age=22,new UserId=2,Name=“XieQing“,Age=25,;/获取特定人时所用的过

31、滤条件,p 参数属于 User 类型var results = user.Where(p = p.Name = “YJingLee“).ToList();/用 User 对象的 Age 值计算平均年龄var average = user.Average(p = p.Age);效果图如下:对这个 Lambda 表达式做个简要分析:var resultsdelegate = user.Where(delegate(User p)return p.Name = “YJingLee“;/ 返回一个布尔值);var averagedelegate = user.Average(delegate(User

32、 p)return p.Age;);Lambda 表达式 L 可以被转换为委托类型 D,需要满足以下条件:L 的参数类型要与 D 的参数个数相等,类型相同,返回类型相同,无论是表达式,还是语句块。注意隐式类型要参与类型辨析。Lambda 表达式树Lambda 表达式树允许我们像处理数据(比如读取,修改)一样来处理 Lambda 表达式。我以一个例子简单说明:Expression filter = n = (n * 3) 接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据

33、LINQ 模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。我们来总体看看 LINQ 架构在.NET3.5 下,微软为我们提供了一些命名空间LINQ 包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。LINQ to SQL 全称基于关系数据的.NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于 SQL 的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提

34、供强类型。LINQ to XML 在 System.Xml.LINQ 命名空间下实现对 XML 的操作。采用高效、易用、内存中的 XML工具在宿主编程语言中提供 XPath/XQuery 功能等。说了这么多,我们还是用一个简单的实例说明一下 LINQ 带来的体验。第一步:建立 dbml(Database Mark Language。数据库描述语言,是一种 xml 格式的文档,用来描述数据库)文件,以 Northwind 数据库为例,上述 Customers 类被映射成一个表,对应数据库中的 Customers 表 第二步:创建一个 ASP.NET 页面,在页面上加入一个 GridView 控件

35、 第三步:编写代码进行数据绑定 第四步:运行显示结果。好了,就说这么多吧,大家应该对 LINQ 有了总体的了解。最后我对 LINQ 还有一点疑惑,在此提出,请熟悉的朋友来探讨:1. LINQ 是在 ADO.NET 之上的,那么在将来它会代替 ADO.NET 吗? 2. 在大型项目中使用 LINQ,它的效率如何呢? 接下来,我们开始从 LINQ to SQL 语句入手,来全面了解一下 LINQ,就从最简单的 Where 说起吧,这个在编写程序中也最为常用。Where 操作适用场景:实现过滤,查询等功能。说明:与 SQL 命令中的 Where 作用相似,都是起到范围限定也就是过滤作用的,而判断条件

36、就是它后面所接的子句。Where 操作包括 3 种形式,分别为简单形式、关系条件形式、First()形式。下面分别用实例举例下:1.简 单 形 式 :例如:使用 where 筛选在伦敦的客户var q =from c in db.Customerswhere c.City = “London“select c;再如:筛选 1994 年或之后雇用的雇员:var q =from e in db.Employeeswhere e.HireDate = new DateTime(1994, 1, 1)select e;2.关 系 条 件 形 式 :筛选库存量在订货点水平之下但未断货的产品:var q

37、=from p in db.Productswhere p.UnitsInStock 10m | p.Discontinuedselect p;下面这个例子是调用两次 where 以筛选出 UnitPrice 大于 10 且已停产的产品。var q =db.Products.Where(p=p.UnitPrice 10m).Where(p=p.Discontinued);3.First()形 式 :返回集合中的一个元素,其实质就是在 SQL 语句中加 TOP (1)。简单用法:选择表中的第一个发货方。Shipper shipper = db.Shippers.First();元素:选择 Cus

38、tomerID 为“BONAP”的单个客户Customer cust = db.Customers.First(c = c.CustomerID = “BONAP“);条件:选择运费大于 10.00 的订单:Order ord = db.Orders.First(o = o.Freight 10.00M);LINQ 体 验 (5)LINQ to SQL 语 句 之 Select/Distinct 和Count/Sum/Min/Max/Avg上一篇讲述了 LINQ,顺便说了一下 Where 操作,这篇开始我们继续说 LINQ to SQL 语句,目的让大家从语句的角度了解 LINQ,LINQ 包

39、括 LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML,但是相对来说 LINQ to SQL 在我们程序中使用最多,毕竟所有的数据都要在数据库运行着各种操作。所以先来学习 LINQ to SQL,其它的都差不多了,那么就从 Select 说起吧,这个在编写程序中也最为常用。本篇详细说明一下 Select 和 Count/Sum/Min/Max/Avg。Select/Distinct 操作符适用场景:o(_)o 查询呗。说明:和 SQL 命令中的 select 作用相似但位置不同,查询表达式中的 se

40、lect 及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来;延迟。Select/Distinct 操作包括 9 种形式,分别为简单用法、匿名类型形式、条件形式、指定类型形式、筛选形式、整形类型形式、嵌套类型形式、本地方法调用形式、Distinct 形式。1.简 单 用 法 :这个示例返回仅含客户联系人姓名的序列。var q =from c in db.Customersselect c.ContactName;注意:这个语句只是一个声明或者一个描述,并没有真正把数据取出来,只有当你需要该数据的时候,它才会执行这个语句,这就是延迟加载(deferred loading)。如果,在声明

41、的时候就返回的结果集是对象的集合。你可以使用 ToList() 或 ToArray()方法把查询结果先进行保存,然后再对这个集合进行查询。当然延迟加载(deferred loading)可以像拼接 SQL 语句那样拼接查询语法,再执行它。2.匿 名 类 型 形 式 :说明:匿名类型是 C#3.0 中新特性。其实质是编译器根据我们自定义自动产生一个匿名的类来帮助我们实现临时变量的储存。匿名类型还依赖于另外一个特性:支持根据 property 来创建对象。比如,var d = new Name = “s“ ;编译器自动产生一个有 property 叫做 Name 的匿名类,然后按这个类型分配内存,

42、并初始化对象。但是 var d = new “s“;是编译不通过的。因为,编译器不知道匿名类中的 property 的名字。例如 string c = “d“;var d = new c; 则是可以通过编译的。编译器会创建一个叫做匿名类带有叫 c的 property。例如下例:newc,ContactName,c.Phone;ContactName 和 Phone 都是在映射文件中定义与表中字段相对应的 property。编译器读取数据并创建对象时,会创建一个匿名类,这个类有两个属性,为ContactName 和 Phone,然后根据数据初始化对象。另外编译器还可以重命名 property 的

43、名字。var q =from c in db.Customersselect new c.ContactName, c.Phone;上面语句描述:使用 SELECT 和匿名类型返回仅含客户联系人姓名和电话号码的序列var q =from e in db.Employeesselect newName = e.FirstName + “ “ + e.LastName,Phone = e.HomePhone;上面语句描述:使用 SELECT 和匿名类型返回仅含雇员姓名和电话号码的序列,并将 FirstName 和LastName 字段合并为一个字段“Name”,此外在所得的序列中将 HomePhone 字段重命名为 Phone。var q =from p in db.Productsselect newp.ProductID,HalfPrice = p.UnitPrice / 2;上面语句描述:使用 SELECT 和匿名类型返回所有产品的 ID 以及 HalfPrice(设置为产品单价除以 2 所得的值)的序列。3.条 件 形 式 :

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报