LinqToObject(1)——查询

简介: LINQ,语言级集成查是Language INtegrated Query的意思,它是连接对象领域和数据领域的一座桥梁。可以通过C#,对各种数据源进行Linq查询: sql数据库(LinqToSql),xml文档(LinqToXml),ado.net的数据集,以及支持IEnumerable或IEnumerable接口的任意对象集合。

LINQ,语言级集成查是Language INtegrated Query的意思,它是连接对象领域和数据领域的一座桥梁。可以通过C#,对各种数据源进行Linq查询:

sql数据库(LinqToSql),xml文档(LinqToXml),ado.net的数据集,以及支持IEnumerableIEnumerable<T>接口的任意对象集合。

Linq查询一般分三个步骤进行:得到数据源——建立查询——执行查询。下面详细介绍查询。这些查询结合LinqPad来测试,关于LinqPad介绍请见:

http://www.cnblogs.com/jams742003/archive/2010/05/05/1728124.html

 

(一)基本查询

基本查询包括,得到数据源,查询条件,分组,排序,投影。

1)通过字符串来演示

LinqPad上在statements模式下进行以下测试:

string  strTemp  =   " Oh,What a pity! " ;
string [] strTemps  =  strTemp.Split( new   char [] {  '   ' ' , ' ' ! '  });
 

var query 
=  from st  in  strTemps
            
where  st.Contains( ' a ' )
            orderby st.Length descending
            select st;

query.Dump();

 

可以得到结果:

 

What

a

 

说明:

·数据源strTemps

·定义变量st

·条件,where,用来查找单词中含有字母a的单词

·结果排序,按单词长度降序

·投影,把单词添充到结果query

 

现在通过匿名类型对投影进行设置:将单词和单词的长度做为结果进行填充

string  strTemp  =   " Oh,What a pity! " ;
string [] strTemps  =  strTemp.Split( new   char [] {  '   ' ' , ' ' ! '  }); 

var query 
=  from st  in  strTemps
            
where  st.Contains( ' a ' )
            orderby st.Length descending
            select 
new  { 含有字母a的单词  =  st, 单词的长度  =  st.Length };

query.Dump();

 

结果:

 

含有字母a的单词

单词的长度

What

4

a

1

 

上边两种都是以语句方式进行的查询,也可以以方法方式进行查询:

string  strTemp  =   " Oh,What a pity! " ;
string [] strTemps  =  strTemp.Split( new   char [] {  '   ' ' , ' ' ! '  }); 

var query 
=  strTemps
            .Where(st 
=>  st.Contains( ' a ' ))
            .OrderBy(st 
=>  st.Length)
            .Select(st 
=>  st);

query.Dump();

 

结果同上,

string  strTemp  =   " Oh,What a pity! " ;
string [] strTemps  =  strTemp.Split( new   char [] {  '   ' ' , ' ' ! '  }); 

var query 
=  strTemps
             .Where(st 
=>  st.Contains( ' a ' ))
             .OrderBy(st 
=>  st.Length)
             .Select(st
=> new {含有字母a的单词  =  st, 单词的长度  =  st.Length});

query.Dump();

 

通过方法进行查询时需要Lambda表达式,关于Lambda请见:

http://www.cnblogs.com/jams742003/archive/2009/12/23/1630737.html

其中的方法指的是扩展方法

 

下面,实现分组,为了演示分组功能,现在通过数据库来实现。

 

Unid

Name

Version

2

宋江

5

38

张青

1

40

张清

1

41

ww

0

 

这张表是数据,现在以Version来分组:

from c  in  Customers
group c by c.Version into selfGroup
where  selfGroup.Count() > 1
select selfGroup

 

查询以Version进行分组,且通过into selfGroup来对分组进行后续筛选,选择组内成员数在大于1的,结果是:

 

Key=

1

 

 

Unid

FirstName

LastName

CreateTime

Address

Version

38

2010-1-6 9:40:47

清河县1

1

40

2010-1-6 10:00:32

未知1

1

78

 

 

 

 

2

 

以下通过数据功能来介绍查询方法

(二)排序

方法OrderByDescendingOrderByThenByThenByDescending

降序排列

int [] ii  =   new   int [] {  1 90 12 25 55  };
var q
= ii 
    .OrderByDescending(p
=> p)
    .Select(p
=> p);
q.Dump();

 

结果:

 

90

55

25

12

1

 

(三)结果集操作

·Distinct:去重

·Except:返回一集合中存在,另一集合不存在的结果

·Intersect:交集

·Union:并集

 

string  str1 = " abc123aab " ;
string  str2 = " abc456 "

// Distinct
var q1 = str1.Distinct();
q1.Dump();

 

 

a

b

c

1

2

3

 

// Except
var q2 = str1.Except(str2);
q2.Dump();

 

1

2

3

 

// Intersect
var q3 = str1.Intersect(str2);
q3.Dump();

  

a

b

c

 

// Union
var q4 = str1.Union(str2);
q4.Dump();

 

a

b

c

1

2

3

4

5

6

 

(四)限定符

AnyAllContains

Any用于判断是否存在元素

All 用于判断数据源中的元素是否全部满足条件

Contains用于判断数据源是否包含指定的元素

 

string  str  =   " Hello world! " ;
 

Console.WriteLine(
" 是否含有元素:{0} "
str.Any() 
==   true   ?   " "  :  " " );
 

Console.WriteLine(
" 是否全是字母:{0} "
str.All(p 
=>  Char.IsLetter(p))  ==   true   ?   " "  :  " " );
 

Console.WriteLine(
" 是否包含He:{0} "
str.Contains(
" He " ));

 

 

(五)数据分区

SkipSkipWhileTakeTakeWhile

Take:取前n

Skip:跳过前n

TakeWhile:返回满足条件的

SkipWhile:跳过满足条件的,返回剩余的

string  str  =   " 0123456789 "

// 得到前5个
var q1  =  str.Take( 5 );
q1.Dump(); 

// 得到数据直到数字大于6
var q2  =  (from p  in  str
          select p).TakeWhile(p 
=>  Convert.ToInt32(p.ToString())  <   6 );
q2.Dump(); 

var q22 
=  str.TakeWhile(p  =>  Convert.ToInt32(p.ToString())  <   6 );
q22.Dump();
 

// 跳过前5个
var q3  =  str.Skip( 5 );
q3.Dump();
 

// 大于6的跳过
var q4  =  str.SkipWhile(p  =>  Convert.ToInt32(p.ToString())  <   6 );
q4.Dump();

 

结果略。

 

(六)生成新值序列

DefaultIfEmptyEmptyRangeRepeat

 

DefaultIfEmpty:返回序列,如果序列为空,则返回集合中元素的默认值。例如,如果是整型数组,如果为空,那会返回整型的默认值:0;如果是对象数组,那会返回:null

List < int >  numbers  =   new  List < int > ();
var q1
= numbers.DefaultIfEmpty();
q1.Dump(); 

List
< Customer >  list = new  List < Customer > ();
var q3
= list.DefaultIfEmpty();
q3.Dump();

 

结果:

 

0

 

null

 

后边几个找不到。

 

(七)元素操作

FirstLastFirstOrDefaultLastOrDefaultElementAtElementAtOrDefaultSingleSingleOrDefault

 

可以从字面上理解意思,每种都有两种类型,例如FirstFirstOrDefault,用于返回第一个元素,如果第一个元素超出索引,则返回元素类型的默认值。

int [] ii = new   int []{ 1 , 21 , 0 , 36 };

int  _first = ii.First();
Console.WriteLine(_first); 

int  _last = ii.Last();
Console.WriteLine(_last); 

int  _top2 = ii.ElementAt( 1 );
Console.WriteLine(_top2); 

int  _top6 = ii.ElementAtOrDefault( 5 );
Console.WriteLine(_top6);

 

结果:

1

36

21

0

其中第40,是索引处不存在元素,所以返回元素类型的默认值,即整型的默认值:0

 

(八)数据转换

AsEnumberable:返回IEnumeralbe<T>类型

AsQueryable:将IEnumerable<T>转化为IQueryable

Cast:强制转换

ToArray:转换为数组(还有一个作用就是强制执行查询,因为查询是懒惰的(延迟))

ToList:转换为List<T>,另一个作用同上

int [] ii = new   int []{ 1 , 21 , 0 , 36 };

var q
= ii.ToList();

foreach ( int  i  in  q)
    Console.Write(i
+ "   " );

 

(九)聚合

聚合类方法包括数量,平均数,和值,最大最小值等。

AverageCountLongCountMaxMinSum

 

int [] ii = new   int []{ 1 , 21 , 0 , 36 };

int  k = ii.Sum(p => p);
Console.Write(k);

 

结束之前推导一下LambdaFunc<T>Sum扩展方法:

int [] ii = new   int []{ 1 , 21 , 0 , 36 };

 

计算这个集合的和值

int  sum1 = ii.Sum(p => p);
Console.WriteLine(sum1);

 

其中Sum方法的参数部分是一个Func<T,TResult>参数,这个参数是一个委托类型,关于Func<T>请见:

http://www.cnblogs.com/jams742003/archive/2009/10/31/1593393.html

 

Func<T,TResult>,表示一个T类型的参数,且返回Tresult类型的一个方法委托。现在由Func委托来实现:

Func < int , int >  fun = p => p;
int  sum2 = ii.Sum(fun);

Console.WriteLine(sum2);

 

接下来以匿名方法来实现:

Func < int , int >  funn = delegate ( int  i)
{
    
return  i;
};

int  sum3 = ii.Sum(funn);
Console.WriteLine(sum3);

 

然后通过明确方法来实现:

 

Func < int , int >  funnn = SelfSum;

int  sum4 = ii.Sum(funnn);
Console.WriteLine(sum4); 

static   int  SelfSum( int  i)
{
    
return  i;
}

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
Web App开发 弹性计算 编解码
最佳实践:如何扩展你的SRS并发能力?
当我们用SRS快速搭建了视频服务,业务也开始上线运行了,很快就会遇到一个问题:如何支持更多的人观看?如何支持更多的人推流?这本质上就是系统的水平扩展能力,SRS当然是支持的,而且有多种扩展的方法,这篇文章就就详细分析各种扩展的方案,以及各种方案的应用场景和优缺点。
2972 0
最佳实践:如何扩展你的SRS并发能力?
|
弹性计算 应用服务中间件
注册阿里云免费领取云服务器,全流程账号注册、实名认证到免费服务器申请
阿里云账号注册与免费服务器申请流程: 1. 访问官网并点击注册,支持手机验证码、支付宝、淘宝和钉钉注册。 2. 手机号注册需获取验证码完成注册;支付宝等方式注册自动关联实名信息。 3. 实名认证:个人推荐支付宝认证,扫码授权即可;企业认证同样便捷。 4. 免费服务器申请:访问免费中心,选择服务器点击“立即试用”,最长期限3个月。
|
Web App开发 移动开发 缓存
微信小程序面试题汇总
微信小程序面试题汇总
850 0
|
前端开发
CSS实现鼠标悬停图片向上浮动,放大,翻转
CSS实现鼠标悬停图片向上浮动,放大,翻转
467 0
|
人工智能 前端开发 JavaScript
探索前端技术栈:构建现代Web应用的基石
探索前端技术栈:构建现代Web应用的基石
406 1
|
弹性计算 专有云
专有云ecs水位盘古巡检命令
专有云ecs水位盘古巡检命令
266 1
|
数据采集 编解码 监控
函数计算助力语雀构建稳定且安全的业务架构
语雀是一个专业的云端知识库,用于团队的文档协作。现在已是阿里员工进行文档编写和知识沉淀的标配,并于 2018 年开始对外提供服务。
5772 99
函数计算助力语雀构建稳定且安全的业务架构
基于MATLAB的麻雀搜索算法SSA代码解释(对照论文公式)
基于MATLAB的麻雀搜索算法SSA代码解释(对照论文公式)
|
数据采集 供应链 数据管理
|
SQL 关系型数据库 MySQL
MySQL忘记root密码的两种解决方法,skip-grant-tables和init-file
mysql 8里面加了这个参数会自动加上–skip-networking不允许远程连接,加入的方法可以是在命令行加入
625 0