文章目录
- 1.LINQ概述
- 1.1 LINQ介绍
- 1.2 LINQ基本使用
- 1.3 扩展方法介绍
- 1.4 LINQ扩展
- 1.5 总结
- 2. 标准查询操作符
- 2.1 筛选(索引、类型筛选....)
- 2.2 from子句
- 2.3 orderby排序
- 2.4 group分组
- 3. xxxxxxx
1.LINQ概述
1.1 LINQ介绍
LINQ是语言集查询(Language Integrated Query, LINQ)的查询语言,其集成了c#当中的查询语法,可以通过相同的语法访问不同的数据源.
我们来看一个一个简单的LINQ查询的语法,LINQ查询语法和我们熟悉SQL查询语句非常相似,从哪个数据源查询from,查询条件where,以及中间的数据处理orderby操作,最后使用select查询即可.
var query = from x in studentswhere x.age >= 2orderby x.age descendingselect x;
foreach(var x in query) {Console.WriteLine(x.age + " " + x.name);
}
LINQ细节注意
- LINQ是一个查询语句,其必须以from子句开头,以select 或 group 子句结束. 在这两个子句之间可以使用where、orderyby、join、let、其他from子句.
- LINQ当中的子句from、where、select等都是查询中预定义的关键字。
- LINQ查询的执行不是在定义的时候执行,而是在foreach循环访问查询的时候执行查询操作.
1.2 LINQ基本使用
using System.Collections;
class students {public int age { get; set; }public string name { get; set; }public students(int v1, string v2) {this.age = v1;this.name = v2;}
}class Test {static void Main() {List<students> students = new List<students>(); // 定义数据源students.Add(new students(3, "张三"));students.Add(new students(1, "李一"));students.Add(new students(2, "王二"));var query = from x in students // 定义LINQ查询where x.age >= 2orderby x.age descendingselect x;foreach(var x in query) { // 使用foreach语句执行该查询Console.WriteLine(x.age + " " + x.name);}}
}/*
3 张三
2 王二
*/
1.3 扩展方法介绍
介绍
- 在介绍LINQ的扩展方法之前,我们先来了解一下扩展方法的使用,扩展方法是对原有类或者是原有接口实现类的一个扩展,如果我们在这个类或者这个接口实现类上扩展的话,这个类或者是某个接口的实现类都可以拥有对这个方法的使用。
- 扩展方法是一种新语法,并且我们需要注意扩展方法的定义 (扩展方法声明在静态类 + 定义为静态方法 + 第一个参数定义扩展类型 + 第一个参数需要添加this )`
// 将方法添加string类当中
static class TestDelegate {static void sayHello(this string s, int x, int y) {Console.WriteLine("hello wordl....." + x + " " + y);}static void Main() {string s = new string("No hello....");s.sayHello(20, 24);}
}// hello wordl.....20 24
public interface IBase { // 接口void sayHi();
}public static class Strengthen { // 接口的实现类上进行扩展 public static void sayHello(this IBase ibase) {Console.WriteLine("Hello .....");}
}class Achieve : IBase { // 实现类public void sayHi() {Console.WriteLine("hi .....");}static void Main() {Achieve achieve = new Achieve();achieve.sayHi();achieve.sayHello();}
}
/*
hi .....
Hello .....
*/
1.4 LINQ扩展
LINQ扩展 – Enumerable扩展介绍
- 在我们使用var变量定义出query查询后,我们使用foreach()去查询这个数据源的时候,因为foreach的底层数据源的查询的时候是需要实现IEnurable<>接口。
- 对于这个特性,LINQ为这个IEunerable<>接口提供了各种扩展方法,以此增强我们对LINQ语句的使用.(继承了IEnumerable接口的实现类都可以使用这个扩展语法)(不是关键字where 注意区分)
LINQ样例举例分析(对于所有实现了IEnumerable接口都可以调用此Where方法)
LINQ的Where扩展不是对where关键字的扩展,是对于所有实现了IEnumerable接口的一个扩展方法,不是对其本身where关键字,一定要注意这个区别
这个扩展就是对where关键字的扩展,传入一个实现了IEnumerable接口的实现类,通过了Func<>的一个判断,Fun是一个委托
(传入数据源和整形数据,返回一个bool类型的值的判定)
public class Example {public static void Main() {List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8};var query = list.Where((num, index) => num >= 3 && index % 2 == 1); // 利用扩展where完成(大小>=3 索引为奇数)foreach(var item in query) {Console.WriteLine(item); }}
}
// 4 6 8
public class Example {public static void Main() {List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8};Func<int, int, bool> predicate = (num, index) => num >= 3 && index % 2 == 1;var query = list.Where(predicate);foreach(var item in query) {Console.WriteLine(item); }}
}
// 4 6 8
1.5 总结
- LINQ是C#提供的集成查询语言(namesapce System,LINQ)
- LINQ当中有很多已经预定义完成关键字
- 为扩展LINQ当中的方法,LINQ有一个Enumerable类用于扩展方法,具体的扩展方式就是通过对方法进行重载,实现多种扩展方式,这样子对于所有实现该接口的类都可以一起使用这些扩展方法。不是对原本的关键字扩展,是对于实现了这些接口的实现类的统一方法的扩展。
2. 标准查询操作符
2.1 筛选(索引、类型筛选…)
筛选的通用代码(案例只写LINQ查询的关键代码)
using System.Collections;
class students {public int age {get; set;}public string name {get; set;}public students(int v1, string v2){this.age = v1;this.name = v2;}
}class Test{static void Main(){List<students> students = new List<students>();students.Add(new students(1, "A1"));students.Add(new students(2, "B2"));students.Add(new students(3, "C3"));students.Add(new students(4, "A4"));students.Add(new students(5, "B5"));students.Add(new students(6, "C6"));var query = from r in studentswhere r.age >= 2 && r.age <= 5select r;foreach(var x in query) {Console.WriteLine(x.name + " " + x.age);}}
}
筛选:
// 简单查询
var query = from r in studentswhere r.age >= 2 && r.age <= 5select r;// 使用了where() 与 select()扩展
var query = students.Where(r => r.age >= 2 && r.age <= 5).Select(r => r);
索引筛选:
// 利用Where方法的重载方法扩展实现
var query = students.Where((r, index) => index % 2 == 0). // 索引默认从0开始排序Select(r => r);
using System.Collections;
class students {public int age { get; set; }public string name { get; set; }public students(int v1, string v2) {this.age = v1;this.name = v2;}
}class Test {static void Main() {List<students> students = new List<students>(); // 定义数据源students.Add(new students(3, "张三"));students.Add(new students(1, "李一"));students.Add(new students(2, "王二"));var query = from x in students.Where((x, index) => index % 2 == 0) // Where不是对下面where关键字的扩展where x.name == "张三"orderby x.age descendingselect x;foreach(var x in query) { // 使用foreach语句执行该查询Console.WriteLine(x.age + " " + x.name);}}
}// 3 张三
类型筛选:
// 使用OfType()扩展方法,将string类型参数传递给泛型参数
object[] data = { "one", 2, "three", 4, "five", 6 };
var query = data.OfType<string>();
foreach(var item in query) {Console.WriteLine(item);
}