1.1 用from子句指定数据源
from localVar in dataSource
一般情况下,编译器会根据数据源类型自动为from子句的localVar元素制定数据类型
int[] ary = { 1, 2, 3, 5, 7, 9 }; var query = from v in ary select v;
输出结果为:
1.2 用select子句指定目标数据
Student[] arry = { new Student("张三",20,"男"), new Student("李四", 22, "男"), new Student("王五", 21, "女"), new Student("赵六", 21, "女") }; var query = from v in arry select new { v.Name,v.Age,v.Gender}; foreach (var v in query) Console.WriteLine("{0} ", v);
输出结果:
1.3 用where子句指定筛选条件
Student[] arry = { new Student("张三",20,"男"), new Student("李四", 22, "男"), new Student("王五", 21, "女"), new Student("赵六", 21, "女") }; var query = from v in arry where v.Age > 20 where v.Gender == "男" select new { v.Name, v.Age, v.Gender }; foreach (var v in query) Console.WriteLine("{0} ", v);
可以使用多个并列的where子句来进行条件过滤
输出结果:
1.4 用orderby 子句排序(ascending 升序 descending 降序)
Student[] arry = { new Student("张三",20,"男"), new Student("李四", 22, "男"), new Student("王五", 21, "女"), new Student("赵六", 21, "女") }; var query = from v in arry orderby v.Name.Length ascending, v.Age descending select new { v.Name, v.Age, v.Gender }; foreach (var v in query) Console.WriteLine("{0} ", v);
当一个LinQ查询中出现多个orderby的时候,只有最后一句有效
输出结果:
Student[] arry = { new Student("张三",20,"男"), new Student("李四", 22, "男"), new Student("王五", 21, "女"), new Student("赵六", 21, "女") }; var query = from v in arry group v by v.Gender; foreach (var v in query) { Console.WriteLine("{0} ", v.Key); foreach (var x in v) { Console.WriteLine("\t{0}-{1}-{2}", x.Name, x.Age, x.Gender); } }
输出结果:
1.6 用from子句进行复合查询
class Program { class Lessn { public string Name { get; set; } public int Score { get; set; } public Lessn(string name, int s) { Name = name; Score = s; } } class Student { public string Name { get; set; } public int Age { get; set; } public string Gender { get; set; } public List<Lessn> Scores = new List<Lessn>(); public Student(string name, int age, string gender, params Lessn[] lessn) { Name = name; Age = age; Gender = gender; foreach (var x in lessn) Scores.Add(x); } } static void Main(string[] args) { Student[] arry = { new Student("张三",20,"男",new Lessn("数学",81),new Lessn("英语",70),new Lessn("语文",60)), new Student("李四", 22, "男",new Lessn("数学",90),new Lessn("英语",80),new Lessn("语文",50)), new Student("王五", 21, "女",new Lessn("数学",81),new Lessn("英语",55),new Lessn("语文",50)), new Student("赵六", 21, "女",new Lessn("数学",50),new Lessn("英语",70),new Lessn("语文",40)) }; var query = from v in arry from v2 in v.Scores group new { v.Name, v2 } by v.Name; foreach (var v in query) { Console.WriteLine("{0} ", v.Key); foreach (var x in v) { Console.WriteLine("\tName = {0}, scr:{1} == {2}分", x.Name, x.v2.Name, x.v2.Score); } } Console.ReadKey(); } }
输出结果:
1.7用join子句进行联接
内部联接
join element in dataSource on exp1 equals exp2
分组联接
join element in dataSource on exp1 equals exp2 into graName
左外部连接比较复杂 就实例说明
int[] arry1 = { 5, 15, 23 }; int[] arry2 = { 10, 20, 30, 50, 70, 90 }; //通过对分组联接的结果调用DefaultIfEmpty()来执行左外部联接 //DefaultIfEmpty()方法从列表中获取指定元素,如果列表为空,返回默认值。 var query = from v in arry1 join v2 in arry2 on v % 5 equals v2 % 5 into v3 from v4 in v3.DefaultIfEmpty() select new { V = v, V2 = v4 }; foreach(var v in query) { Console.WriteLine("{0}", v); }
输出结果: