二、LinQ使用方法

来源:互联网 发布:游戏编程的软件 编辑:程序博客网 时间:2024/06/05 07:22


一、首先我们看看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判断集合中是否含有、包含指定条件(所有)













0 0
原创粉丝点击