让LINQ中的查询语法使用自定义的查询方法
使用LINQ时有两种查询语法:查询语法和方法语法
查询语法:一种类似 SQL 语法的查询方式
方法语法:通过扩展方法和Lambda表达式来创建查询
例如:
List<int> numberList = new List<int>() { 1, 3, 4, 5 }; //查询语法
var resultUsingQuerySyntax = from item in numberList where item > 3 select item;
//方法语法
var resultUsingMethodSyntax = numberList.Where(p => p > 3); Console.WriteLine("使用查询语法:");
foreach (int i in resultUsingQuerySyntax) { Console.WriteLine(i); } Console.WriteLine("使用方法语法:"); foreach (int i in resultUsingMethodSyntax) { Console.WriteLine(i); }
就是获取大于3的数,最后结果是一样的
从生成的IL代码可以看到,查询语法最终还是会使用方法语法
在这里,查询语法中的where转换成System.Core程序集,命名空间System.Linq下类Enumerable的方法Where。假如想让它转换成自定义Where方法,该如何做呢。可以在一个命名空间下添加一个类,类中包含Where扩展方法,那么编译器就会使用自定义的Where方法了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CustomLinq.Extension { public static class CustomLinqImplementation { public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate) { Console.WriteLine("自定义Where"); return Enumerable.Where(source, predicate); } } }
上面代码在命名空间CustomLinq.Extension下CustomLinqImplementation类定义了一个Where扩展方法,然后这样使用
using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using CustomLinq.Extension; //自定义查询方法所在的命名空间,以前是使用System.Linq namespace CustomLinq { class Program { static void Main(string[] args) { List<int> numberList = new List<int>() { 1, 3, 4, 5 }; //查询语法 var resultUsingQuerySyntax = from item in numberList where item > 3 select item; //这里使用自定义的Where方法 //方法语法 var resultUsingMethodSyntax = numberList.Where(p => p > 3);//这里使用自定义的Where方法 Console.WriteLine("使用查询语法:"); foreach (int i in resultUsingQuerySyntax) { Console.WriteLine(i); } Console.WriteLine("使用方法语法:"); foreach (int i in resultUsingMethodSyntax) { Console.WriteLine(i); } } } }
对比前面那个,只是改了命名空间,看查询语法生成的IL代码,确实使用了自定义的Where方法
看下运行结果,也可以说明使用了自定义的Where方法