先给关注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
操作中有匿名类,其他操作中也有。让我们一起来理解下匿名类。上面的语句与
var q = db.Customers.Select(c=>new {c,ContactName,c.Phone});
是等价的。匿名类是c# 3.0
中新出现的特性。其实质是编译器根据用户定义,自动产生一个匿名的类,帮用户实现临时变量的储存。注意,是临时变量。大量使用匿名类会使程序可读性降低。匿名类还依赖于另外一个特性,就是在c# 3.0
可以支持根据property
来创建对象。比如,有类
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
以前,我们只可以用构造函数来创建其对象,现在在3.0
中支持用property
来创建,即,可以用
var d = new Person { Name = "s" };
来创建对象。在这里,你可能还对var
类型产生疑问。你可能以为c#3.0
和javascript
一样是弱类型的。其实var
并不是c#3.0
的类型,它是编译器的关键字,编译器根据实际变量的返回类型,自动推断类型。那么var
c = null;
是无法编译通过,因为编译不知道null
代表那个类型。所以,c#3.0
还是强类型的。
现在3.0
可以支持用property
来创建对象了,那么就有了匿名类的出现。比如,var d = new { Name = "http://www.my400800.cn" };
编译器自动产生一个有property
叫做Name
的匿名类,然后按这个类型分配内存,并初始化对象。在这个地方,还有个问题,比如,var d = new { "
http://www.my400800.cn
" };
是编译不通过的。因为,编译器不知道匿名类中的property
的名字。但是,如果,
string c = "d"; var d = new { c};
则是可以通过编译的。编译器会创建一个叫做匿名类带有叫c
的property
。
在dlinq
中,比如new
{c,ContactName,c.Phone});
这里出现ContactName
和Phone
都是我们在影射文件中定义的和表中字段相对应的property
。编译器在取会数据并创建对象时,会创建一个匿名类,这个类有两个属性,为ContactName
和Phone
,然后根据数据初始化对象。匿名类还有另外一种形式。
var q =
from e in db.Employees
select new {Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone};
这种形式和第一种不同的是,编译器会重命名property
的名字。当然也可以把两种形式组合起来。
var q =
from p in db.Products
select new {p.ProductID, HalfPrice = p.UnitPrice / 2};
第一个属性的名字不会变,第二个会被重新命名。
好,就先讲这几个,下节我会介绍几个更复杂的用法。
分享到:
相关推荐
在这个入门系列中,我们将深入探讨C# 3.0的关键概念,帮助初学者快速掌握这门强大的编程语言。 1. **匿名方法与Lambda表达式**: C# 3.0 引入了匿名方法,它允许我们在不定义单独的方法的情况下,直接在需要的地方...
总结来说,C# 3.0入门教程会涵盖这些核心概念,通过学习,你可以掌握C#语言的基础,并能够利用LINQ进行高效的数据操作,为后续深入学习C# 4.0及以上版本打下坚实基础。通过实践,你会逐渐熟悉并爱上这种强大而优雅的...
### C# 3.0与LINQ:深入理解与应用 #### 一、LINQ概述 **Language Integrated Query (LINQ)**,即语言集成查询,是Microsoft在.NET Framework 3.5和C# 3.0中引入的一项重大创新。LINQ提供了一种统一的方式来查询...
C# 3.0 林林总总的 LINQ(Language Integrated ...这个入门系列涵盖了LINQ的基础用法,从简单的查询到复杂的聚合和连接操作,通过学习这一系列教程,开发者将能够熟练地在C#中运用LINQ进行数据操作,提升开发效率。
C#中的LINQ主要由四个部分组成:LINQ to Objects、LINQ to XML、LINQ to SQL和LINQ to DataSet。 1. **LINQ to Objects**:这是针对内存中对象集合的查询,比如ArrayList或List。它允许开发者直接对这些对象进行...
C# 3.0入门 C# 3.0是LINQ首次引入的版本,它还带来了匿名类型、自动属性、对象初始化器、集合初始化器等新特性。学习C# 3.0,意味着要掌握这些新功能,以便更好地利用LINQ。 总之,LINQ是C#中强大的查询工具,它...
查询表达式使用C# 3.0及以后版本引入的声明式语法,例如`from`、`select`、`where`、`group by`等关键字。查询表达式可以包含多个子句,如`where`用于过滤,`orderby`用于排序,`join`用于合并,`let`用于中间变量,...
《C# 2008数据库入门经典第四版》一书不仅涵盖了C#语言本身的核心概念和技术要点,还深入探讨了如何利用C#与SQL Server 2005进行高效协作,实现复杂数据库应用程序的开发。无论是初学者还是有一定经验的开发者,都能...
在C#编程语言中,LINQ(Language Integrated Query,语言集成查询)是一项强大的特性,首次引入于C# 3.0,它极大地简化了数据查询的过程,无论数据源是数组、集合、XML文档还是数据库。LINQ允许开发者使用一种统一的...
- **扩展方法**:LINQ引入了一系列扩展方法,如`Where()`、`Select()`等,这些方法可以直接作用于集合类型,简化了数据筛选和转换的过程。 - **延迟执行**:LINQ支持延迟执行,即查询操作不会立即执行,而是在获取...
通过一系列文章,作者详细介绍了如何使用LINQ to SQL进行基础和高级查询操作,包括Where、Select、Distinct、Count、Sum、Min、Max、Avg、Join、Order By、Group By、Having、Exists、In、Any、All、Contains、Union...
C# 3.0引入了LINQ(Language Integrated Query)技术,其中的LINQ to XML提供了一种更简洁的XML操作方式。例如,使用`XDocument`类加载和创建XML: ```csharp XDocument doc = XDocument.Load("path_to_xml_file...
"LINQ - Miscellaneous Operators"则包含了各种查询操作符的使用,如Where、Select、GroupBy等,极大地简化了数据操作。 四、ADO.NET Entity Framework ADO.NET Entity Framework是一个ORM(对象关系映射)框架,...
- **LINQ - Conversion Operators**:LINQ(Language Integrated Query)是C# 3.0引入的查询语言,转换运算符如`Select`和`Cast`用于将数据源转换为所需类型。 - **ADO.NET Entity Framework**:是一个ORM(对象...
LINQ(Language Integrated Query)是C# 3.0引入的一项重要特性,它将查询语法直接融入到C#语言中,使得查询操作如同编写普通代码一样自然。《Beginning C# 2008 Databases》详细解释了LINQ to Objects、LINQ to SQL...
Linq to SQL 支持直接在 C# 代码中使用 LINQ 查询来执行数据库的增删改操作。例如,添加一条新记录: ```csharp MyDataContext db = new MyDataContext(); MyTable entity = new MyTable { Column1 = "value1", ...
4. **使用LINQ to XML**:C# 3.0引入了LINQ(Language Integrated Query),使得XML操作更加简洁。XDocument和 XElement类提供了更直观的API。例如,使用LINQ to XML读取上述XML文档: ```csharp XDocument doc = ...
**LINQ技术的基础—C# 3.0** - **自动属性**: 自动属性简化了属性的定义过程,编译器会自动生成私有成员变量。 - 示例: `public class Customer { public int Id { get; set; } public string Name { get; set; } }...