必须支持LINQ, 咦 ~~~~~~~~ 有点像SQL
表达式以: from子句开头,
select或者group子句结束。
中间可以包含其它句子
int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from n in arr //创建一个查询表达式query
where n > 1 && n < 6
orderby n % 2 ascending, n descending
select n; // var query = from n in arr select n;
foreach (var m in query)
Console.Write(m+" ");
from子句用来指定查询表达式的数据源和范围变量。
from子句指定的数据源的类型必须为IEnumerable、IEenumerable<T>或一种派生类型。
泛型的例子:
List<Person> list = ...
var query = from m in list
select u;
当数据源是非泛型IEnumerable类型时,需要显示指定范围变量的类型
ArrayList list = new ArrayList();
list.Add( ... );//添加Person类的实例
。。。
。。
var query = from Person m in list
select u;
包含多个from子句的查询表达式
int [] arr1 = new int[] {0,1,2,3,4,5,6};
int[] arr2 = new int[] {2,3,34,4,5,6,7};
var query = from a in arr1
from b in arr2
select a+b;
from嵌套的查询表达式
public class tian
{
public string Name;
public List<string> SecondName;
}
查询
List<PersonInfo> list = ...
var query = from u in list //查询list泛型列表
from name in u.SecondName
select u.Name + name;
//创建匿名对象
int[] arr = new int {0,1,2,3,4,5};
var query = from n in arr
select new
{
ID = n,
Name = n.ToString()
};
where 子句
var query = from m in arr
where m < 5 && m >-1
select m;
//
private bool IsEven(int i)//判断i是否为偶数
{
return i%2 == 0? true: false;
}
var query = from m in arr
where IsEven(m)
select m;
let 子句
创建一个新的范围变量,它用于存储子表达式的结果
int[] arr = new int[]{0,1,2,3,4,5,6,7};
var query = from m in arr
let isEven = return n%2 ==0? true:false
where isEven
select n;
orderby 子句
升序 ascending
降序 descending
默认是升序
var query = from n in arr
where n>1 && n<6
orderby n descending
select n;
group子句 ,用来将查询结果分组,并返回一对象序列。
int [] arr = new int[] {0,1,2,3,4,5,6};
var query = from m in arr
where n>1 && n< 6
group n by n %2; //分成了两个组
查询的结构是一个序列(类型为IEnumerable<IGrouping<int,nit>>),该序列的元素类型为IGrouping<int,int>.
foreach(var g in query)
{
foreach(var o in g)
{
Console.WriteLine(o);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testLINQ
{
class Program
{
static void Main(string[] args)
{
int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from n in arr
where n > 1 && n < 6
group n by n % 2; //创建一个查询表达式query
foreach (var a in query)
{
Console.WriteLine("键值为:" + a.Key); //显示每一个分组的键的值
foreach (var b in a)
Console.Write(b + " ");
Console.WriteLine();
}
Console.WriteLine();
Console.ReadLine();
}
}
}
into子句
用来创建一个临时标识符,讲group、join或select子句的结果存储到这个标识符中。
var query = from n in arr
where n>1 && n<6
group n by n %2 into g
from sn in g
select sn;
join 子句 用来连接两个数据,即设置两个数据源之间的关系
3种联接方式
1,内部联接:元素的联接关系必须同时满足两个数据源,类似于SQL语句中的inner join子句
int[] arra = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] arrb = new int[] { 0, 2, 4, 6, 8 };
var query = from a in arra
where a < 7
join b in arrb on a equals b
select a;
foreach (var m in query)
Console.Write(m+" ");
/* 首先选择小于7的元素,然后再和arrb数组进行联接,并获取既包含在{0,1,2,3,4,5,6}集合中、又包含在arrb数组中的元素,最终查询表达式的
结果包含4个元素(0,2,4,6)
*/
2,分组联接:包含into子句的join子句。它将左数据源与右数据源的元素依次匹配。左数据源的所有元素都出现在查询结果中。若在右数据源中找到匹配项,则使用匹配的数据,否则用空表示。
var query = from a in arra
where a < 7
join b in arrb on a equals b into g
select new
{
ID = a,
Values = g
};
3,左外部联接:元素的联接关系必须满足联接中的左数据源,类似于SQL语句中的left join子句。
join 子句的左外部联接将返回左侧数据源序列中的所有元素,就算它们在右侧序列中没有匹配的元素也是这样。
int[] arra = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] arrb = new int[] { 0, 2, 4, 6, 8 };
var query = from a in arra
where a < 7
join b in arrb on a equals b into g
from ab in g.DefaultIfEmpty()
select ab; //创建一个查询表达式query
foreach (var m in query)
Console.Write(m+" ");
(里面有些 0 是因为 右面没有,所以用的0 代替 )
from ab in g.DefaultIfEmpty() :查询g分组中的每一个元素。如果该分组不存在元素,则返回默认值
如果序列为空,则DefaultIfEmpty()方法返回只包含一个元素的序列,该元素类型的值为默认值