上篇学习了Where操作,今天再来看看Select操作如何使用,和上篇一样,本篇仍是以实例为主来。
Select作用我们从字面意思就可以知道,就是查询,和在SQL命令中的Select一样,区别在于使用位置不同,Linq中的Select必须写在语句的最后,而在SQL名字中select确是在开始处。
Select操作可以细分成9种使用形式,分别是简单形式、匿名类型形式、条件形式、自定义类型形式、筛选形式、整形类型形式、嵌套类型形式、本地方法调用形式、Distinct形式。
1、简单形式
例如:获取所有学生的姓名
1
2
|
var names = from student
in
db.Students
select student.Name
|
在Linq中使用延迟加载来使我们觉得效率很高,其实,上面语句只是一个描述而已,并没有真正的取出数据,只有当我们需要的时候Linq才会帮我们把数据加载上。如果我们不想使用延迟加载那么只需要调用ToList()或ToArray()方法即可。
2、匿名类型形式
匿名类型是C#3.0给我们带来的新特性,本质上来说,它是编译器对我们定义的临时变量的一个匿名的存储对象。匿名类型支持根据属性来创建对象,例如:
var obj =
new
{City=
"北京"
};
|
编译器会帮助我们创建一个包含属性City的匿名类,当然我们通过Type类来帮助我们知道这个匿名类型的名字是什么,但是,这个名字对我们来说没有任何意义。
那么接下来我们举例说明匿名类型形式:
1
2
3
4
5
|
var query = from student
in
db.Students
select
new
{
Name = student.FirstName +
" "
+ student.LastName,
Age = student.Age
};
|
上面的例子中我们创建了一个包含Name和Age属性的匿名类,属性Name由student的FisrtName和LastName拼接而成,Age就是student的Age。
3、条件形式
条件形式就是在匿名类型的基础上加上了条件表达式来进行查询,例如
1
2
3
4
5
|
var query = from student
in
db.Students
select
new
{
Name = student.FirstName +
" "
+ student.LastName,
Grade = student.Score > 90 ?
"A"
:
"B"
};
|
4、自定义类型形式
顾名思义,自定义类型形式就是使用我们自己定义的数据类型作为查询结果的方式,例如:
1
2
3
4
5
|
var query = from student
in
db.Students
select
new
Name{
FirstName = student.FirstName,
LastName = student.LastName
};
|
在上面的查询中我们使用了自己定义的Name类型,它包含FirstName和LastName两个属性。
5、筛选形式
筛选形式就用到了我们上篇中介绍的Where操作,在上篇中我们已经举过Where操作相关的例子了,这里就不再举例了。
6、整形类型形式
原文作者将这种类型称为shaped形式,我不是特别理解,但是看完之后发现这种形式只是在匿名类型形式之上的一种扩展,就是将匿名类型的属性也做成匿名类型的,这样我们就得到了shaped形式。
例如:
1
2
3
4
5
|
var query = from student
in
db.Student
select
new
{
Name=student.FirstName +
" "
+ student.LastName,
Address=
new
{student.Road,student.City,student.Country}
};
|
7、嵌套类型形式
使用嵌套类型我们可以得到的结果集合中的每个对象又包含一个结果集合。主要是用在主从表的情况下。
例如:
1
2
3
4
5
6
7
|
var query = from student
in
db.Students
select
new
{
student.Name,
Contacts = from contact
in
db.ContactDetails
where contact.SId = student.SId
select contact
};
|
8、本地方法调用形式
这种形式就是在select语句中调用本地方法。这个形式我就直接使用原作者的举例了。
例如:在查询中调用本地方法PhoneNumberConverter将电话号码转换成国际格式。
1
2
3
4
5
6
7
8
9
|
var q = from c
in
db.Customers
where c.Country ==
"UK"
|| c.Country ==
"USA"
select
new
{
c.CustomerID,
c.CompanyName,
Phone = c.Phone,
InternationalPhone = PhoneNumberConverter(c.Country, c.Phone)
};
|
PhoneNumberConverter方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
string
PhoneNumberConverter(
string
Country,
string
Phone)
{
Phone = Phone.Replace(
" "
,
""
).Replace(
")"
,
")-"
);
switch
(Country)
{
case
"USA"
:
return
"1-"
+ Phone;
case
"UK"
:
return
"44-"
+ Phone;
default
:
return
Phone;
}
}
|
9、Distinct形式
该形式是用来筛选不重复的结果集,类似于在SQL命令中使用Select Distinct。
例如:
1
2
3
4
|
var query = (
from student
in
db.Students
select student.Age
).Distinct();
|
上面的查询等同于下面的SQL语句
1
|
SELECT DISTINCT Age FROM Students;
|
总结,今天学习了Select操作,理解了Select的不同形式的使用,对我有很大的帮助,同时我查到一个能够帮助我们进行Linq和SQL语句转换的工具——Linqer(Linqer Download)。大家可以下载使用,这样就可以更加了解Linq与SQL直接的联系。