版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C# 3.0 LinQ入门系列目录导航1 C# 3.0 入门系列(一)从linq开始引C# 3.0。2 C# 3.0入门系列(二)数据库的准备,引入Linq To Sql的准备。3 C# 3.0入门系列(三) 第一个Linq To Sql工程。4 C# 3.0入门系列(四)-之Select操作 Select语法。5 C#3.0入门系列(五)-之Where操作 Where操作语法。6 C#3.0入门系列(六)-之OrderBy操作 OrderBy 操作语法。7 C#3.0入门系列(七)-之OR工具介绍 映射工具的介绍,OR Designer8 C#3.0入门系列(八)-之GroupBy操作 Gr
2、oupBy 操作入门。9 C#3.0入门系列(九)-之GroupBy操作 更多GroupBy操作。10 C#3.0入门系列(十)-之Join操作 Join操作11 C#3.0入门系列(十一)-之In, Like操作 In & Like操作12 C#3.0入门系列(十二)-Lambda表达式中LiftingLambda表达式中的Lifting目录C# 3.0 入门系列(一)2C# 3.0入门系列(二)4C# 3.0入门系列(三)7C# 3.0入门系列(四)-之Select操作12C#3.0入门系列(五)-之Where操作16C#3.0入门系列(六)-之OrderBy操作20C#3.0入门
3、系列(七)-之OR工具介绍24C#3.0入门系列(八)-之GroupBy操作30C#3.0入门系列(九)-之GroupBy操作34C#3.0入门系列(十)-之Join操作40C#3.0入门系列(十一)-之In, Like操作48C#3.0入门系列(十二)-Lambda表达式中Lifting53C# 3.0 入门系列(一) 谈到dlinq,就不得不先说linq。让我们先看看什么是linq。linq是 Language Integrated Query的缩写。那么事实上dlinq就是 Database Language Integrated Query 的缩写。lin
4、q和dlinq最大的区别就在与linq是对内存进行操作,而dlinq的操作对象为数据库。我们先来看一个linq的例子。在这之前,你需要安装s2008beta版本。可以到 下载。如果,你的机器上是vs2005的英文版,你还需要安装一个linq preview版本。你可以到下面地址去下载。微软也提供了好多学习的地方。先给出几个链结。好,我们先来看一个linq的例子。这个例子可以从linq的说明文档上得到。the linq sample 1using System; 2using System.Query; 3using Sys
5、tem.Collections.Generic; 4 5class app 6 static void Main() 7 string names = "Burke", "Connor", "Frank", 8
6、 "Everett", "Albert", "George", 9 &
7、#160; "Harris", "David" 1011 IEnumerable<string> expr = from s in names 12 &
8、#160; where s.Length = 513 orderby s
9、14 select s.ToUpper();1516 foreach (string item in expr)17
10、60; Console.WriteLine(item);18 1920你可能感觉比较陌生。放心,这大概是第一次看到缘故。在这里像 from ,where,orderby, select等都是linq的保留字,都该用蓝色显示的,但是好像cnblogs还没有开始支持。所以插入代码时,他们就被当作普通字符了。其实,query expression看起来和sql语句很像。 比如 select * from table1 where column1 = ""我第一次看到linq时,就感觉是写在程序里的sql
11、语句。只不过,以前我们都是用string类型形成一个sql语句,然后通过command或adapter传到sql server中。而现在,感觉就像把sql语句直接当成程序代码来实现。这只不过是我们的一个错觉。这个例子,只不过是从一个string的数组中,提取出长度为5的,并且把提取的数据全部变成大写。IEnumerable<string> 使用到了c#2.0中的泛型。 该列子的结果,返回一个数据集,存放到expr中。 在这里,从那个数据集中取的结果,是用in 表达的,如列所示,from s in names , 在names集合中,取出s。s代表一条条纪录。where 表示条件,o
12、rderby 表示按什么排序。select 选择那些字段组成变量。这里,你可能会觉得奇怪,s变量在那里声明的呢。我第一看到这里的时候,也感到奇怪。其实s变量是names变量里的元素,你在in names 时,已经声明了s变量。在这个列子中,大家可以先感受一下linq,在随后的章节中,我会为大家介绍更多。对内存数组的查询,并不能显示出linq的强大功能,对数据库的操作,才使得linq更加具有实际意义。在随后的章节中,我将逐渐介绍dlinq的语法。 C# 3.0入门系列(二) 在第一篇中,我已经和大家简单介绍了linq。也和大家提起linq是C# 3.0里的一个特性。不过,你去装linq priv
13、iew时,你会发现,它提供了许多vb的linq代码。从现在的情况看,linq会被移植到.net framework下。在本篇中,笔者将开始更加详细的介绍dlinq。同时,也会介绍很实用的技巧和方法。在这之前,你需要安装s2008beta版本。可以到 下载。如果,你的机器上是vs2005的英文版,你还需要安装一个linq preview版本。你可以到下面地址去下载。以后的章节中,笔者将会配合这个版本,进行讲解,并对它里面提供的例子进行详细的说明。安装linq preview后,你可以在安装目录下,找到安装程序提供的例子。C# 的应该在C:Program FilesLINQ Previ
14、ewC#SamplesSampleQueries目录下。打开该工程。因为dlinq主要是对数据库进行操作,你还需要准备数据库。例程给你提供的数据库是用.SQLEXPRESS来实现的。说实话,这个版本的数据库实在是难用。我建议大家使用SQL2000 or SQL2005. 你可以在C:Program FilesLINQ PreviewData目录下找到一个叫做NORTHWND的数据库文件。如图所示,把它附加到你的服务器上。因为NORTHWND是SQL SERVER附带的例子数据库,你可能需要将原来的删掉,才能附加新的上去。你也可以到 下载for beta2的sample。其数据文件的路径为,Li
15、nqSamplesSampleQueriesData你在附加这个数据库的时候,有可能碰到SQL2000 附加不上去的问题。你可以给我留言,我这里有SQL2000 的数据库备份。在附加完数据库后,你需要修改程序文件了,让SampleQueries的程序使用你刚附加的数据库。打开SampleQueries的程序,在Solution Explorer中找到DLinqSamples.cs文件,打开它,找到24行。如下的代码。private readonly static string connString = "AttachDBFi
16、leName='" + dbPath + "'Server='" + sqlServerInstance + "'Integrated Security=SSPI;enlist=false"将它替换为 private readonly static string connString = "Server=yourSever;Database=northwi
17、nd;User=yourname;Password=yourPassword"这样,你就可以使用你刚附加的数据库了。或许你要问为什么非要用这个新的数据库,为什么不用SQL SERVER附带,那是因为在这个新的数据库中,我们添加了许多新的东西。_一切都准备好以后,我们就可以来看这个例子了。笔者在这么没有兴趣讲解SampleQueries是如何设计的,也没有兴趣讲解它是如何取到code的。这里我们只讲dlinq。先让我们来看看大体的一个界面。界面做的很漂亮也很简洁。选择左边目录树,第一个主接点是linq的101例子,前面我也和大家讲过来linq的主要是针对内存操作。dlinq才是针对数据
18、库操作。我们的重点依然在dlinq上。如图所示,选择where接点中第一个,然后右边代码区会显示该段代码,点run sample!,下面会首先出现程序翻译的sql语句,再下面是返回的数据集。在正式讲解dlinq的语法前,笔者也许还要把northwind数据库中的表以及表之间的关系简单地和大家交代下。 几个表的关系如上图。我们常用的几个要说明下。一个是Customers表为客户表,一个是Orders表为订单表,一个是Products表为产品表,最后一个是Order Details表,为订单详细表。因为northwind是大家已经很熟悉的一个数据库,我就不再做赘言。 下章,我将依然为大家准备最关键
19、的一个环节,影射文件。C# 3.0入门系列(三) 从本节开始,笔者将会和大家一起开始体验dlinq了。前面我们准备了数据库,也对数据库之间的关系做了初步的了解。有了数据库之后,数据和对象是一个什么样的关系呢?从dlinq的设计来看,它主要是为了解决data!=objects 的问题而产生的。那么,现在,有了dlinq后数据和对象之间就可以有一个一一对应的关系了。我们既可以根据数据库生成这种影射的代码,也可以根据影射代码生成数据库。简单的说,数据库和影射代码实现了相互转化。linq preview提供了一个很好的工具,可以帮我们实现从数据库到代码的影射。它就是sqlmetal。beta2的sql
20、metal在C:Program FilesMicrosoft SDKsWindowsv6.0Abin目录下,或C:WINDOWSMicrosoft.NETFrameworkv3.5目录打开cmd,运行sqlmetal程序。会出现下面的提示。运行如下的命令。 sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs/language:csharp你可以根据northwind数据库生成一个nwind.cs文件。你会在 linq priview的bin目录发现它_ 。这里的参数的含义也非常的
21、明确,笔者也不在多赘述。在这里,我想和大家简要介绍下这个影射文件nwind.cs因为这个是程序自动生成的,我们暂时最好不要改,在后面的进阶中,我将为大家详细阐述此文件中code的含义,以及实现inheritance我们先来看Northwind 类的定义。 public partial class Northwind : DataContext 首先partial关键词是C.中出现的,本文不是讲解C.的,相关知识请参阅相关文献。Northwind 的名字是根据你数据库的名字定义的我们发现,它必须从DataContext 类继承,才可以获得dlinq的支持。再往
22、下看 public Table<Order> Orders; public Table<Product> Products; public Table<OrderDetail> OrderDetails;Table类是dlinq中定义的,这里他用了一个范性的概念,类似于C+中的模板。但C#和C+还是有区别,C+
23、的泛型模板类似替换,只是编译时用实际类型进行替换,因此对任何类型都可以,但是C#的泛型是在虚拟机级别上的实现,因此在编译时会进行类型检查(引)。Order, Product和OrderDetail等,都是sqlmetal程序根据数据库里对应的表,自动产生的类。也就是class和table是一一对应的。而这样也恰恰实现了object和data的对等。让我们去看看Order的定义吧。我这里只贴出部分。 只简单介绍几个点,更加详细内容我会在进介阶段解释,包括inheritance。 Table(Name = "Orders")
24、 public partial class Order : System.Data.DLinq.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged private int _OrderID;
25、60;private string _CustomerID; private System.Nullable<int> _EmployeeID; public Order() this._Orde
26、rID = default(int); this._OrderDetails = new EntitySet<OrderDetail>(new Notification<OrderDetail>(this.attach_OrderDetails), new Notification<OrderDetail>(this.detach_Orde
27、rDetails); this._Customer = default(EntityRef<Customer>); this._Employee = default(EntityRef<Employee>);
28、0; this._Shipper = default(EntityRef<Shipper>); Column(Storage = "_OrderID", DBType = "Int NOT
29、60;NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true) public int OrderID get
30、 return this._OrderID; 因为影射文件是自动产生的,并不需要我们自己去手动制造,节约了我们大量劳动力。在这里,我们可以看到Order 类必须从两个接口继承,而且还要去实现接口里定义的方法。它还定义了一些私有的变量,
31、这些似乎和数据表里字段没有关系。其实,它在Property里描述着呢。dlinq会为每个数据表的字段定义一个对应Property,然后,会在其上加上attribute,如Column(Storage = "_OrderID", DBType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDBGenerated = true)用来描述该Property对应数据表那个字段(Storage ),是什么类型(DBType ),是否主键(IsPrimaryKey ),是否自动增(IsDBGenerated )等
32、。在这里,我们暂时先不要对这个文件进行修改,等你对它比较熟悉了之后,你就可以用它自己定义继承,比如product下面还有好多种product呢。我将会在进介中介绍。有了影射文件后,你是不是跃跃欲试,急于想创建一个自己的linq project了呢?在你安装了linq preview后,选择file->new->Project. 你会发现比平时多了个选项。如图所示。选择linq preview后,选择一个linq console application,添上名字,让我们立马开始linq之旅吧。创建好工程后,将你自己前面产生nwind.cs文件加入到工程中,在program.cs中的键
33、入如下代码。using System;using System.Collections.Generic;using System.Text;using System.Query;using System.Xml.XLinq;using System.Data.DLinq;using System.Data;using System.Data.SqlClient;using nwind;class Program static void
34、60;Main(string args) Northwind db = new Northwind("Your Connection String"); var q = from c in db.Customers
35、 select c; foreach (var c in q)
36、 Console.WriteLine(c.ContactName); 运行,哈哈,你的第一个linq preview的工程跑起来了,开心伐。呵呵,好从下章开始,笔者将着重给大家讲解dlinq的语法。从下章开始,本系列将更名为入门系列,呵呵,本来就没有书可读吗。同时将发布在首页精华区,关注dlinq的朋友注意接收哦。C# 3.0入门系列(四)-之Select操作 先给关注dlinq的朋友们道歉,最近工作实在忙,
37、没有时间来写blog。从本节开始,我们讲dlinq语法咯。我们先从select子句讲起。看下面的例子。 var q = from c in db.Customers select c.ContactName;这是一个最简单的dlinq查询语句,查询得到联系人的名字。在这里,我需要提醒下大家的是,像这个语句
38、只是个声明,dlinq并没有真正把数据取出来,只有当你需要该数据的时候,它才会帮你去取,这就是延迟加载(deferred loading)。如果,你想在声明的时候就希望dlinq帮你取到数据,你可以使用ToList() 或ToArray()方法。如上例。 var q = (from c in db.Customers
39、60; select c.ContactName).ToArray();或 var q = (from c in db.Customers select
40、;c.ContactName).ToList();在这里,我还要提醒大家一点。dlinq返回的结果集是对象的集合,不是数据的。 在dlinq执行的时候,它会先将上面的标准查询转换成dlinq的API(也有人叫级连方法),比如,下面语句 var q =
41、0; from c in db.Customers where c.City = "London" select c;就
42、会先被转化成 var q = db.Customers.Where(c=>c.City= "London").Select(c=>c); 也就是说,这两个语句是等价的。而后,dlinq会解析影射文件,根据dlinq的query语句,自动产生sql语句,并把sql送到sql server服务器,根据返回的数据集,创建相应的对象。在这里,你可能会对c=>c感到非常陌生。这是Lambda表达式(expression),你可以理解c为结果集里的任一对象,这对象的类型是和你结果集里元素类型是一致的 。这里理解起来可能困难。我们一起来理解下数据即是对象的概念
43、。我相信这会帮我们理解Lambda表达式。在dlinq之前,在java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational 持久和查询服务。dlinq其实质上,是在吸收了众多技术的基础上,比他们更加强大的工具。数据即对象的含义有两层。第一,数据结构(表结构)即是类。可以描述为Table Schema-Class。第二,表里的数据即是变量,描述为Data-object(variable)。那么,我们在来理解Lambda表达式可能就容易些。刚才我们已经说了,var q = db.Customers.Where(c=>c.City= &qu
44、ot;London").Select(c=>c);将会返回Customers对象的集合,也就说,这个集合的每个元素就是一个Customer。Lambda表达式是对c# 2.0中的anonymous methods(匿名方法)的扩展。它更加简化匿名方法的实现形式。这里的c是一种隐式的声明,编译器会自动推断它的实际类型,也可以显示声明,比如, var q = db.Customers.Where(Customer c) => c.City = "London").ToList(); Lambda表达式用=>符号跟随一个表达式,
45、这个表达式,需要返回一个类型,其实质就是一个方法返回一个类型。它只是更加简洁的匿名方法。然后,where等操作符用它返回的这个类型做为参数。关于Lambda表达式的具体实现,我会在进阶部分详细讲解。这里不再赘述。有一点要提醒大家的是,标准的查询语句,必须是select语句在最后,而级连表达式,各种操作符的位置并不是很重要。比如var q = db.Customers.Where(c=>c.City= "London").Select(c=>c); 可以写成var q = db.Customers.Select(c=>c).Where(c=>c.Cit
46、y= "London");它们两个是一样的,但是,标准查询就不可以换位子,select语句必须在最后。虽然在级连表达式,各种操作符的位置并不是很重要,但是他们还是有区别的。特别是在使用匿名类后,区别很明显。但万变不离其宗,我们只要记住,下一个操作符总是在上一个操作符所筛选的数据集的基础上进行筛选。这点,我会在以后的blog中,更加详细的说明。在select语句中,另一个难点是匿名类。比如列子 var q =
47、60; from c in db.Customers select new c.ContactName, c.Phone;其实不光在select操作中有匿名类,其他操作中也
48、有。让我们一起来理解下匿名类。上面的语句与var q = db.Customers.Select(c=>new c,ContactName,c.Phone);是等价的。匿名类是c# 3.0中新出现的特性。其实质是编译器根据用户定义,自动产生一个匿名的类,帮用户实现临时变量的储存。注意,是临时变量。大量使用匿名类会使程序可读性降低。匿名类还依赖于另外一个特性,就是在c# 3.0可以支持根据property来创建对象。比如,有类 public class Person
49、; private string name; public string Name get return name
50、; set name = value; 以前,我们只可以用构造函数来创建其对象,现在在3.0中支持用property来创建,即,可以用 var d = new Person Name = "s" ; 来创建对象。在这里,
51、你可能还对var类型产生疑问。你可能以为c#3.0和javascript一样是弱类型的。其实var并不是c#3.0的类型,它是编译器的关键字,编译器根据实际变量的返回类型,自动推断类型。那么var c = null; 是无法编译通过,因为编译不知道null代表那个类型。所以,c#3.0还是强类型的。现在3.0可以支持用property来创建对象了,那么就有了匿名类的出现。比如,var d = new Name = "s" ;编译器自动产生一个有property叫做Name的匿名类,然后按这个类型分配内存,并初始化对象。在这个地方,还有个问题,比如,var d = new &
52、#160; "s" ;是编译不通过的。因为,编译器不知道匿名类中的property的名字。但是,如果, string c = "d" var d = new c; 则是可以通过编译的。编译器会创建一个叫做匿名类带有叫c的property。 在dlinq中,比如new c,ContactName,c.Phone);这里出现ContactName和Phone都是我们在影射文件中定义的和表中字段相对应的property。编译器在取
53、会数据并创建对象时,会创建一个匿名类,这个类有两个属性,为ContactName和Phone,然后根据数据初始化对象。匿名类还有另外一种形式。 var q = from e in db.Employees
54、 select new Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone;这种形式和第一种不同的是,编译器会重命名property的名字。当然也可以把两种形式组合起来。
55、0; var q = from p in db.Products selec
56、t new p.ProductID, HalfPrice = p.UnitPrice / 2;第一个属性的名字不会变,第二个会被重新命名。好,就先讲这几个,下节我会介绍几个更复杂的用法。 C#3.0入门系列(五)-之Where操作 从本节开始,本文正式更名为C#3.0入门系列。先发布一则消息,VS2007 Beta版本已经发布咯,下载地址:大家快去下载呀,我也好和大家一起体验该版本最新功能呀。dlinq也更名为linq to sql本文也跟着做相应变化,稍候,我会去更新前面的文章。我们先接着讲linq的语法。Select操作
57、最简单的, var q = from c in db.Customers &
58、#160; select c.ContactName;匿名类的, var q = from c in db.Customers
59、 select new c.ContactName, c.Phone;, var q =
60、; from e in db.Employees select new Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone;, &
61、#160; var q = from p in db.Products se
62、lect new p.ProductID, HalfPrice = p.UnitPrice / 2;条件的 var q = from p in db
63、.Products select new p.ProductName, Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Out Of Stock": "In Sto
64、ck"这种条件的会被翻译成sql中casewhenconditionthenelse的。nametype形式的: var q = from e in db.Employees
65、; select new Name FirstName = e.FirstName, LastName = e.LastName;只所以是nametype的,是因为Name类
66、是已经定义好的,也就是说,你可以用这种方式,返回你需要类型的对象集shaped形式的: var q = from c in db.Customers
67、0; select new c.CustomerID,
68、 CompanyInfo = new c.CompanyName, c.City, c.Country, ContactInfo = new c.ContactName, c.ContactTitle&
69、#160; 该形式,其select操作使用了匿名对象,而这个匿名对象中,其属性也是个匿名对象。nested形式的: var q =
70、; from o in db.Orders select new
71、0;o.OrderID, DiscountedProducts =
72、;from od in o.OrderDetails where od.Discount > 0.0
73、160; select od, FreeShippingDiscount = o.Freight
74、; 其返回的对象集中的每个对象DiscountedProducts属性中,又包含一个小的集合。也就是每个对象也是一个集合类。Distinct形式的: var q = (
75、; from c in db.Customers select c.City ) .Distinct();该形式,筛选该字段中不相同的值。会被翻译为select
76、 distinct city from customerswhere操作:最简单的 , var q = from c in db.Customers
77、; where c.City = "London" select c;, var
78、;q = from e in db.Employees where e.HireDate >= new DateTime(1994,&
79、#160;1, 1) select e;或与关系的where条件 , var q =
80、 from p in db.Products where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued
81、60; select p;, var q = from p in db.Products &
82、#160; where p.UnitPrice > 10m | p.Discontinued select p;,
83、160; var q = db.Products.Where(p=>p.UnitPrice > 10m).Where(p=>p.Discontinued);在上例中,和语句先被翻译成类似语句的形式,再被翻译成sql语句,送回数据服务器。他们基本上一样的。欠套在first操作中的where条件:first操
84、作,其实质就是在sql语句前,加了一个top, Customer cust = db.Customers.First(c => c.CustomerID = "BONAP"); Order ord =
85、 db.Orders.First(o => o.Freight > 10.00M);第一个例子,是筛选customerid为"BONAP"的客户,第二个筛选订单运费大于10的订单。First操作必须用这种级连的形式。比如 Shipper shipper = db.Shippers.First();也可以把linq的expression和级连的形式混合使用,比如第一个例子,加入first操作,
86、0; var q = (from c in db.Customers where c.City =
87、60;"London" select c).First();如果加入first操作,其返回是一个具体的对象,而不是一个集合。如果first操作没有条件,它只是简单的在sql语句中添加top,如果有条件,它在翻译时,就会加入条件语句。 C#3.0入门系列(六)-之OrderBy操作 本节讲orderby操作我突然在想这么一个问题,读者会T-SQL吗?要是不知道,那我写的是不是太简
88、单了呢?做个调查哦,不知道的举手OrderBy操作简单的,按雇用日期排序,默认为升序 var q = from e in db.Employees
89、; orderby e.HireDate select e;带where条件的,shipcity为london的。 var
90、0;q = from o in db.Orders where o.ShipCity = "London"
91、 orderby o.Freight select o;或 var q&
92、#160;= from o in db.Orders orderby o.Freight
93、0; where o.ShipCity = "London" select o;在这里where和orderby的顺序并不重要。而在T-SQL中,where和orderby有严格的位置限制。OrderByDescending的,按价格降序。
94、160; var q = from p in db.Products
95、60; orderby p.UnitPrice descending select p;ThenBy的和ThenByDescending,也就是按多个列进行排序,第一个列子是先按city,city相同的再按contactname排序,第二个例子中,第二序列为降序。ThenBy:
96、0; var q = from c in db.Customers orderby c.City, c.
97、ContactName select c;ThenByDescending: var q = &
98、#160; from o in db.Orders where o.EmployeeID = 1 orderby o
99、.ShipCountry, o.Freight descending select o;对这两个句子解释下。对于ThenBy操作,其级连形式为: var q = db.Customers.OrderBy(c => c.City).ThenBy
100、(c => c.ContactName).ToList();因为T-SQL中,并没有ThenBy语句,其依然翻译为OrderBy所以,也可以用下面语句来表达var q = db.Customers.OrderBy(c => c.ContactName).OrderBy(c => c.City).ToList();所要注意的是,是两个orderby的顺序,多个orderby操作时,级连方式是按逆序即先按city排时,city要放在最后。对于降序的,用相应的降序操作符替换即刻。 &
101、#160; var q = db.Customers.OrderByDescending(c => c.City).ThenByDescending(c => c.ContactName).ToList();需要说明的是,orderby操作,不支持按type排序,也不支持匿名类。比如 var q = db.Customers.OrderBy(c => c).ToList();和var q = db.Customers.OrderBy(c => new c.City,c.ContactName).ToList();会被抛出异常。但是,既然提了,大家在这个问题就不会犯错误,常见的错误是前面的操作有匿名类,再跟orderby时,比较的是类别。比如var q = db.Customers.Select(c => new c.City, c.Address ).Ord
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国红外器件项目投资可行性研究报告
- 中国双线电话机项目投资可行性研究报告
- 中国铁路客票自动检票机项目投资可行性研究报告
- PVC折盒片行业深度研究报告
- 2025年航天军工模块电源项目提案报告模板
- 2026年牙科用椅市场前景分析
- 2026年中国房屋修缮行业市场规模及投资前景预测分析报告
- 2026年中国防水材料厂行业市场前景预测及投资价值评估分析报告
- 鸡血红石子行业深度研究报告
- 高温高湿双向轴流风机行业深度研究报告
- 校友会年度工作计划
- GB/T 18037-2008带电作业工具基本技术要求与设计导则
- 光通量测量课件
- 纪检监察办案业务知识课件
- 《高等教育心理学》全套课件
- 自适应滤波课件
- 北大博士申请专家推荐信范文
- 山西省临汾市基层诊所医疗机构卫生院社区卫生服务中心村卫生所室地址信息
- 二年级消防安全教育课件
- 水工建筑物安全监测与控制
- 完美国际灵机一问答案
评论
0/150
提交评论