约束:LINQ查询表达式必须以from子句开头,以select或group子句结束
from [d] in IEnumerale where [d].[propertity] = xxx select [d]
from...in...:指定要查找的数据以及范围变量,多个from子句则表示从多个数据源查找数据
join...in...on...equals...:指定多个数据源的关联方式
where:指定元素的筛选条件,多个where子句则表示了并列条件,必须全部都满足才能入选,每个where子句可以使用&&、||连接多个条件表达式
group:指定元素的分组字段
select:指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型(目前通常被指定为匿名类型)
orderby、descending:指定元素的排序字段和排序方式,当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序方式
into:提供一个临时的标识符,该标识符可以引用join、group和select子句的结果。
(1)直接出现在join子句之后的into关键字会被翻译为GroupJoin。
(2)select或group子句字后的into它会重新开始一个查询,让我们可以继续引入where、orderby和select子句,它是对分步构建查询表达式的一种简写方式。
let:引入用于存储查询表达式中子表达式结果的范围变量,通常能达到层次感会更好,使代码更易于月的
例子:masterList和x都是对象列表list<Object>
var res = from m in masterList where m.menpai = '武当派' && m.level >= 9
等价
var res = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮");
等价
static bool Test1(MartialArtsMaster master)
{
if (master.Level > 8) return true;
return false;
}
var res = masterList.Where(Test1);
联合查询:
var res = from m in masterList
from k in kongfuList
where m.Kongfu == k.Name && k.Power > 90
select m;
等价
var res = masterList.SelectMany(m => kongfuList, (m, k) => new { master = m, kongfu = k }).Where(x => x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);
对查询结果做排序 orderby (descending)
var res = from m in masterList
where m.Level > 8 && m.Menpai == "丐帮"
//orderby m.Age descending // 默认从小到大,加上descending从大到小
orderby m.Level, m.Age //按照多个字段进行排序,如果字段的属性相同,就按照第二个属性排序
select m;//表示m的结果结合返回
var res = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮").OrderBy(m => m.Age);
如果排序判断条件有多个,后面的排序要用ThenBy
var res = masterList.Where(m => m.Level > 8).OrderBy(m => m.Level).ThenBy(m => m.Age);
Join on集合联合查询
var res = from m in masterList
// join...in... 表示要连接的表,on后面为连接条件,等于要用equals,不能用==
join k in kongfuList on m.Kongfu equals k.Name
where k.Power > 90
select new { master = m, kongfu = k };
分组查询 into groups
把武林高手按照所学功夫分类,看一下那个功夫修炼的人数最多
var res = from k in kongfuList
join m in masterList on k.Name equals m.Kongfu
into groups //分组
orderby groups.Count() // 这个可以获得数量
select new { kongfu = k, count = groups.Count() };
按照自身字段分组 group by
var res = from m in masterList
group m by m.Kongfu
into g
select new { count = g.Count(), key = g.Key };//g.Key Key表示是按照那个属性分的组
网友评论