C#Linq的10个练习
1.LINQ的两种语法
2.一些有用的LINQ扩展方法
扩展方法 | 描述 | 延期 |
All | 如果源数据中的所有条目都与谓词匹配,则返回true | 否 |
Any | 如果源数据中至少有一个条目与谓词匹配,则返回true | 否 |
Contains | 如果数据源含有指定的条目或值,则返回true | 否 |
Count | 返回数据源的条目数 | 否 |
First | 返回数据源的第一个条目 | 否 |
FirstOrDefault | 返回数据源的第一个条目或无条目时,返回默认值 | 否 |
Last | 返回数据源的最后一个条目 | 否 |
LastOrDefault | 返回数据源的最后条目或无条目时,返回默认值 | 否 |
Max Min | 返回由lambda表达式表示的最大值或最小值 | 否 |
OrderBy OrderByDescending | 基于lambda表达式返回的值对源数据进行排序 | 是 |
Reverse | 反转数据源中数据项的顺序 | 是 |
Select | 设计一个查询结果 | 是 |
SelectMany | 把每个数据项投射到一个条目序列中,然后把所有这些结果序列连接成一个序列 | 是 |
Single | 返回数据源的第一个条目或有多个匹配时,抛出一个异常 | 否 |
SingleOrDefault | 返回数据源的第一个条目或无条目时,返回默认值;或者有多个匹配条目时,抛出一个异常 | 否 |
Skip SkipWhile | 跳过指定数目的元素或当谓词匹配时,跳过 | 是 |
Sum | 对谓词选定的值求和 | 否 |
Take TakeWhile | 从数据源的开始处选择指定数目的元素或当谓词匹配时,选择条目 | 是 |
ToArray ToDictionary ToList | 把数据源转换成数组或其他集合类型 | 否 |
Where | 过滤掉源数据中与谓词不匹配的条目 | 是 |
3.LINQ查询表达式
约束 | LINQ查询表达式必须以from子句开头,以select或group子句结束。 |
| |
关键字 | 功能 |
from…in… | 指定要查找的数据源以及范围变量,多个from子句则表示从多个数据源查找数据。 注意:c#编译器会把“复合from子句”的查询表达式转换为SelectMany()扩展方法。 |
join…in…on…equals… | 指定多个数据源的关联方式 |
let | 引入用于存储查询表达式中子表达式结果的范围变量。通常能达到层次感会更好,使代码更易于阅读。 |
orderby、descending | 指定元素的排序字段和排序方式。当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序方式 |
where | 指定元素的筛选条件。多个where子句则表示了并列条件,必须全部都满足才能入选。每个where子句可以使用谓词&&、||连接多个条件表达式。 |
group | 指定元素的分组字段。 |
select | 指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型。(目前通常被指定为匿名类型) |
into | 提供一个临时的标识符。该标识可以引用join、group和select子句的结果。 1) 直接出现在join子句之后的into关键字会被翻译为GroupJoin。(into之前的查询变量可以继续使用) 2) select或group子句之后的into它会重新开始一个查询,让我们可以继续引入where, orderby和select子句,它是对分步构建查询表达式的一种简写方式。(into之前的查询变量都不可再使用) |
4.复写linq语法详细中的11个例子
1)简单的LINQ语法
1 2 3 4 5 6 7 | //1 var ss=from r in db.testTable select r; //2 var ss1=db.testTable; //3 string sssql= "selec * from testTable" ; |
2)带Where的查询
1 2 3 4 5 6 7 8 | //1 var ss=from r in db.testTable where r.rpId>10 select r; //2 var ss1=db.testTable.Where(p=>p.rpId>10); //3 string sssql= "select * from testTable where rpId>10" ; |
3)简单函数计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //1 //获取最大的rpId var ss=(from r in db.testTable select r).Max(p=>p.rpId); //获取最小的rpId var ss=(from r in db.testTable select r).Min(p=>p.rpId); //获取结果集的总数 var ss=(from r in db.testTable select r).Count(); //获取rpId的和 var ss=(from r in db.testTable select r).Sum(p=>p.rpId); //2 //var ss1 = db.testTable.Max(p=>p.rpId); //var ss1 = db.testTable.Min(p => p.rpId); //var ss1 = db.testTable.Count() ; var ss1 = db.testTable.Sum(p => p.rpId); Response.Write(ss); //3 string sssql = "select max(rpId) from testTable" ; sssql = "select min(rpId) from testTable" ; sssql = "select count(1) from testTable" ; sssql = "select sum(rpId) from testTable" ; |
4)排序
1 2 3 4 5 6 7 8 9 10 11 | var ss=from r in db.testTable where r.rpId>10 orderby r.rpId descending //倒序 //orderby r.rpId ascending //正序 select r; //正序 var ss1=db.testTable.OrderBy(p=>p.rpId).Where(p=>p.rpId>10).ToList(); //倒序 var ss2=db.testTable.OrderByDescending(p=>p.rpId).Where(p=>p.rpId>10).ToList(); string sssql= "select * from testTable where rpId>10 order by rpId [decs|asc]" ; |
5)top(1)
1 2 3 4 5 6 7 8 | //如果取最后一个可以按倒序排列再取值 var ss=(from r in db.testTable select r).FirstOrDefault(); // var ss1=db.testTable.FirstOrDefault(); var ss1=db.testTable.First(); string sssql= "select top(1) * from testTable" ; |
6)跳过前面多少条数据取余下的数据
1 2 3 4 5 6 7 8 | //1 var ss=(from r in db.testTable orderby r.rpId descending select r).Skip(10); //跳过前10条数据,取10条之后的所有数据 //2 var ss1=db.testTable.OrderByDescending(p=>p.rpId).Skip(10).ToList(); //3 string sssql= "select * from (select ROW_NUMBER() over(order by rpId desc) as rowNum,* from testTable) as t where rowNum>10" ; |
7)分页数据查询
1 2 3 4 5 6 7 8 9 10 11 | //1 var ss=(from r in db.testTable where r.rpId>10 orderby r.rpId descending select r).Skip(10).Take(10); //取第11条到第20条的数据 //2.Take(10):数据从开始获取,获取指定数量的连续数据 var ss1=db.testTable.OrderByDescending(p=>p.rpId).Where(p=>p.rpId>10).Skip(10).Take(10).ToList(); //3 string sssql="select * from (select ROW_NUMBER() over(order by rpId desc) as rowNum,* from testTable) as c where rowNum>10 and rowNum<=20"; |
8)包含,类似like ‘%%’
1 2 3 4 5 6 7 8 | //1 var ss = from r in db.testTable where r.SortsText.Contains( "张" ) select r; //2 var ss1 = db.testTable.Where(p => p.SortsText.Contains( "张" )).ToList(); //3 string sssql = "select * from testTable where SortsText like '%张%'" ; |
参考资料
Linq之旅:Linq入门详解(Linq to Objects)