首先我们看看LinQ应用架构。
LinQ定义的大约40个查询的操作符,如常见的Select、from、in、where以及Orderby等。LINQ 提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。
语法实例:
1、假设我们需要从一个集合中查询数据用一般 简单粗暴的方法可以这么写
var rets = new List<MartialArtsMaster>();
foreach (var temp in master) {
if (temp.Level > 8) {
rets.Add(temp);
}
}
foreach (var ret in rets) Console.WriteLine(ret);
2、如果我们使用常见的LinQ的表达式写法可以简化代码繁杂项,增加了代码的可阅读性如:
var rets = from m in master where m.Level > 8 && m.Menpai == "这里是限制条件" select m;
3、扩展方法的写法,在方法中加入限制条件,通过返回值来限定LinQ,如:
var rets = master.Where(test);
//过滤方法
static bool test(MartialArtsMaster master) {
if (master.Level > 8) return true;
return false;
}
扩展方法可以用Lambda简化,如:
var rets = master.Where(m => m.Level > 8 ).OrderBy(x => x.Level).ThenBy(x=>x.Age);
二、LinQ联合查询。
联合查询通俗理解就是联合在一起查询,但是查询什么?怎么查询?联合的必要条件是什么?
既然是联合,那肯定是需要两个集合,或者数据源了,在这里我就统一用Lambda的表达式和扩展方法来写(因为简单粗暴)
假设我们有两个集合,一个是角色信息的集合,其中包括ID、Name、所学功夫等,另一个集合就是功夫信息集合,其中包含ID,Name、Power。下面我们写第一个表达式的LinQ联合查询:
var rets = from m in master from k in kongfu where m.Kongfu == k.Name && k.Power > 90 select m;//select new {master = m,kongfu = k};
这里查找了两个集合一个是master一个是kongfu的集合,限制条件是 master(大侠)的功夫等于kongfu中名字(可以看需要指定),且杀伤力大于90的大侠,select m 然后返回目标数据,如何需要返回两个目标数据,则我们需要加上new关键字和 { “这里指定返回目标数据” }。下面我们看看扩展方法的写法:
var rets = master.SelectMany(m => kongfu, (m, k) => new {master = m, kongfu = k}).Where(x=>x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);
SelectMany:投影操作符(C#中的方法,具体资料请Google)
我先把一些关键字放上来,免得不理解
Join on 的联合用法:
var rets = from m in master join k in kongfu on m.Kongfu equals k.Name where k.Power > 90 select new {master = m ,kongfu = k};
把konogfu的集合加入到master中查询。
into groups
分组查询:
var rets = from k in kongfu join m in master on k.Name equals m.Kongfu into groups orderby groups.Count() select new {kongfu = k,count=groups.Count()};
把相同的属性放入一个组中,然后在这个组中查找数据
自身字段,一个集合的时候分组查询
var rets = from m in master group m by m.Kongfu into g orderby g.Count() select new {count = g.Count(), g.Key};
单个集合的时候使用,把拥有相同属性(功夫)的大侠放入一个组中查找
量词操作 any all:
bool rets = master.Any(x => x.Menpai == "丐帮");
Console.WriteLine(rets);
bool rets = master.All(m => m.Menpai == "丐帮");
Console.WriteLine(rets);
any 判断集合中是否含有、包含指定条件(有一个)
all判断集合中是否含有、包含指定条件(所有)
网友评论