前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq基础知识小记三

Linq基础知识小记三

作者头像
郑小超.
发布2018-01-26 16:10:34
8850
发布2018-01-26 16:10:34
举报
文章被收录于专栏:GreenLeavesGreenLeaves

1、子查询

Linq中的子查询思想和Sql中的子查询其实差不多,

对于方法语法,一个子查询包含在另一个子查询的Lambda表达式中,代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = names.OrderBy(n => n.Split().Last());

n.Split().Last()就是一个子查询

下面通过一个例子来讲解Linq子查询的两种不同的方式.找出一个IEnumerable<T>长度中最长的字符串

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
//方法语法
IEnumerable<string> method = names.Where(n=>n==(names.OrderBy(l => l.Length)).Last());
foreach (var n in method)
{
   Console.WriteLine(n);
}
代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
//表达式语法
var express = from n in names
where n ==
(from i in names orderby i.Length descending select i).First()
select n;
foreach (var n in express)
{
   Console.WriteLine(n);
}

2、本地查询和解释查询

本地查询(Linq To Object)和解释查询(Linq To Sql)对于子查询的处理方式不一样.

(1)、本地查询(Linq To Object)对于外部查询的每一次循环,子查询都会被重新被执行一次,所以像上面的案例当外部查询循环每执行一次,内部子查询就会被重新执行一次,这是很严重的性能浪费,所以上面的案例可以这样改写,代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
int shortest = names.Max(n => n.Length);
//表达式语法
var express = from n in names
where n.Length == shortest
     select n;
foreach (var n in express)
{
     Console.WriteLine(n);
}

(2)、解释查询处理子查询的方式和本地查询就截然不同,在解释查询中,外部查询和子查询是作为一个单元进行处理的,这样就只需要联结一次数据库就行了,所以上面的案例适合解释查询,不适合本地查询.

(3)、子查询不会改变Linq延迟执行的特性,因为子查询总是间接调用的.

2、Linq查询创建攻略

常用的Linq查询方式有三种两种已经在前面用到过了,下面有个案例,去除一个字符串数组中的所有的元音字母,然后对长度大于1的元素进行按长度排序.

第一种:链式查询

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = names.Select(n => Regex.Replace(n, "[aeiou]", "")).Where(n => n.Length > 1)
.OrderBy(n => n.Length);
foreach (var n in result)
{
      Console.WriteLine(n);
}

第二种:类似Sql子查询的查询

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = from n in
(
      from n in names
      select Regex.Replace(n, "[aeiou]", "")
)
where n.Length > 1
orderby n.Length
select n;
                                      
foreach (var n in result)
{
      Console.WriteLine(n);
}

第三种:重点讲解,into关键字

select关键字或者group关键字意味着查询的结束,但是into关键字可以使我们在结果投影之后继续操作,它是对分步构建查询表达式的一种简写方式,代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = from n in names
select Regex.Replace(n, "[aeiou]", "")
into noVowel
where noVowel.Length > 1
orderby noVowel.Length
select noVowel;                   
foreach (var n in result)
{
   Console.WriteLine(n);
}

3、数据转换

Linq的数据转换,也叫结果投影。到目前为止,我们只看到了单个标量的元素,但是通过对象初始化器和匿名类型和let关键字我们能输出更复杂的数据类型

(1)、对象初始化器

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<TempProjection> temp = from n in names
select new TempProjection
{
        Original = n,
        Vowelless = Regex.Replace(n, "[aeiou]", "")
};

IEnumerable<string> query =
from n in temp
where n.Vowelless.Length > 3
select n.Original;

foreach (var n in query)
{
      Console.WriteLine(n);
}

class TempProjection
{
   public string Original { get; set; }
   public string Vowelless { get; set; }
}

(2)、匿名类型

匿名类型其实和对象初始化其差不多,就是我们不用创建类型,让编译器来帮助我们创建,代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var  temp = from n in names //注意这里只能用关键字var 
select new 
{
        Original = n,
        Vowelless = Regex.Replace(n, "[aeiou]", "")
};

IEnumerable<string> query =
from n in temp
where n.Vowelless.Length > 3
select n.Original;

foreach (var n in query)
{
      Console.WriteLine(n);
}

使用匿名类型配合关键字var能帮助我们极大的减少代码量.

(3)、Let关键字

Let关键字能帮助我们引入新的变脸的同时,保持范围变量,示例代码如下:

代码语言:javascript
复制
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var temp = from n in names //注意这里只能用关键字var 
let vowelless = Regex.Replace(n, "[aeiou]", "")
where vowelless.Length > 1
select n;

foreach (var n in temp)
{
    Console.WriteLine(n);
}

let关键字非常灵活和方便,就像例子看到的那样。而且,我们可以使用多个let关键字,并且后面的 let表达式可以引用前一个let关键字引入的变量。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档