C# 3.0入门系列(四)-之Select操作

先给关注dlinq的朋友们道歉,最近工作实在忙,没有时间来写blog。从本节开始,我们讲dlinq语法咯。我们先从select子句讲起。看下面的例子。

var q =    from c in db.Customers    select c.ContactName;

这是一个最简单的dlinq查询语句,查询得到联系人的名字。在这里,我需要提醒下大家的是,像这个语句只是个声明,dlinq并没有真正把数据取出来,只有当你需要该数据的时候,它才会帮你去取,这就是延迟加载(deferred loading)。如果,你想在声明的时候就希望dlinq帮你取到数据,你可以使用ToList() 或ToArray()方法。如上例。

var q = (from c in db.Customers  select c.ContactName).ToArray();

var q = (from c in db.Customers   select c.ContactName).ToList();

在这里,我还要提醒大家一点。dlinq返回的结果集是对象的集合,不是数据的。

在dlinq执行的时候,它会先将上面的标准查询转换成dlinq的API(也有人叫级连方法),比如,下面语句

var q =    from c in db.Customers    where c.City == "London"    select c;

就会先被转化成 var q = db.Customers.Where(c=>c.City== "London").Select(c=>c); 也就是说,这两个语句是等价的。而后,dlinq会解析影射文件,根据dlinq的query语句,自动产生sql语句,并把sql送到sql server服务器,根据返回的数据集,创建相应的对象。在这里,你可能会对c=>c感到非常陌生。这是Lambda表达式(expression),你可以理解c为结果集里的任一对象,这对象的类型是和你结果集里元素类型是一致的。这里理解起来可能困难。我们一起来理解下数据即是对象的概念。我相信这会帮我们理解Lambda表达式。

在dlinq之前,在java领域有Hibernate,在net领域有NHibernate技术,来实现object/relational 持久和查询服务。dlinq其实质上,是在吸收了众多技术的基础上,比他们更加强大的工具。数据即对象的含义有两层。第一,数据结构(表结构)即是类。可以描述为Table Schema--Class。第二,表里的数据即是变量,描述为Data--object(variable)。那么,我们在来理解Lambda表达式可能就容易些。刚才我们已经说了,var q = db.Customers.Where(c=>c.City== "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表达式用=>符号跟随一个表达式,这个表达式,需要返回一个类型,其实质就是一个方法返回一个类型。它只是更加简洁的匿名方法。然后,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.City== "London");它们两个是一样的,但是,标准查询就不可以换位子,select语句必须在最后。虽然在级连表达式,各种操作符的位置并不是很重要,但是他们还是有区别的。特别是在使用匿名类后,区别很明显。但万变不离其宗,我们只要记住,下一个操作符总是在上一个操作符所筛选的数据集的基础上进行筛选。这点,我会在以后的blog中,更加详细的说明。

在select语句中,另一个难点是匿名类。比如列子

var q =   from c in db.Customers   select new {c.ContactName, c.Phone};

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索select
, 数据
, c/c++/数据结构
, 表达式
, 语句
, 操作符
, mybatis级连查询问题
一个
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-07-31 23:43:25

C# 3.0入门系列(四)-之Select操作的相关文章

C# 3.0入门系列(十)-之Join操作

本节讲join操作.我们知道,T-sql中,有三种最基本的join,inner join, left join, 和right join. 而dlinq并不支持right join.道理很简单,right join以right表为基础,left表中没有对应记录的,将以null值填充.而dlinq以left表做为主表创建对象.如果一个对象为null,你如何获取它的其他的属性呢? 在C# 3.0入门系列(四)-之Select操作一文中,我们提到了query expression首先会被翻译成标准的A

C# 3.0入门系列-目录导航

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工具介绍 C# 3

C# 3.0入门系列(五)-之Where操作

从本节开始,本文正式更名为C#3.0入门系列.先发布一则消息,VS2007 Beta版本已经发布咯,下载地址: http://www.microsoft.com/downloads/details.aspx?FamilyID=1FF0B35D-0C4A-40B4-915A-5331E11C39E6&displaylang=en 大家快去下载呀,我也好和大家一起体验该版本最新功能呀. dlinq也更名为linq to sql.本文也跟着做相应变化,稍候,我会去更新前面的文章.我们先接着讲linq的

C# 3.0入门系列(十二)-Lambda表达式中Lifting

Lambda表达式是由匿名方法演化而来的更加高级的形式.关于匿名方法,请参阅http://msdn.microsoft.com/msdnmag/issues/04/05/C20/.关于Lambda表达式的演化,请参阅http://msdn.microsoft.com/msdnmag/issues/07/06/csharp30/default.aspx?loc=zh.英文原版为http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/. 1,L

C# 3.0入门系列(十一)-之In, Like操作

有这么一个例子,寻找一个表中的某个字段介于某个给定的集合该怎么办?Sql写起来很简单,比如:Select * from table where id in (2,3, 4, 5). 就是寻找id字段为这个给定的集合(2,3, 4, 5)内的值.那Linq to Sql该怎么做呢?一个字,简单. In Operator 比如,我们想要查找,"AROUT", "BOLID" 和 "FISSA" 这三个客户的订单.该如何做呢?Linq to Sql是这

C# 3.0入门系列(九)-之GroupBy操作

有朋友反馈说我提供的sample不能编译.大概是版本的问题,可以到http://msdn2.microsoft.com/en-us/bb330936.aspx下载for beta1的版本.本节接着讲groupby. 上一节,我们讲了如何理解groupby返回的结果.本节会延这个思路阐述下去.先来看下面的例子 GroupBy操作中Select的匿名类 var q = from p in db.Products group p by p.CategoryID into g select new {

C# 3.0入门系列(七)--之OR工具介绍(上)

--不得不再次给关注dlinq的朋友道歉了.好久都没有更新blog了.因为工作的变动,还要赶期限,没有时间关注这里了. 先发布一则消息.Orcas Beta1, 这个才是beta1,可以到http://www.microsoft.com/downloads/details.aspx?FamilyID=f10fb5df-e369-4db4-b9a7-845dbf793368&DisplayLang=en 下载.5月1号的版本.最早4月19号就出来过一个,只是没有在意.还有一个http://www.

C# 3.0入门系列(一)

谈到dlinq,就不得不先说linq.让我们先看看什么是linq.linq是Language Integrated Query的缩写.那么事实上dlinq就是Database Language Integrated Query的缩写.linq和dlinq最大的区别就在与linq是对内存进行操作,而dlinq的操作对象为数据库. 我们先来看一个linq的例子.在这之前,你需要安装s2008 beta2版本.可以到 http://msdn2.microsoft.com/en-us/vstudio/a

C# 3.0入门系列(六)-之OrderBy操作

本节讲orderby操作.我突然在想这么一个问题,读者会T-SQL吗?要是不知道,那我写的是不是太简单了呢?做个调查哦,不知道的举手. OrderBy操作 简单的,按雇用日期排序,默认为升序 var q = from e in db.Employees orderby e.HireDate select e; 带where条件的,shipcity为london的. var q = from o in db.Orders where o.ShipCity == "London" orde