让LINQ中的查询语法使用自定义的查询方法

时间:2022-03-30 07:55:43

使用LINQ时有两种查询语法:查询语法和方法语法

查询语法:一种类似 SQL 语法的查询方式

方法语法:通过扩展方法和Lambda表达式来创建查询

例如:

List<int> numberList = new List<int>() { , , ,  };
//查询语法
var resultUsingQuerySyntax = from item in numberList
where item >
select item;
//方法语法 
var resultUsingMethodSyntax = numberList.Where(p => p > );
Console.WriteLine("使用查询语法:");
foreach (int i in resultUsingQuerySyntax)
{
Console.WriteLine(i);
}
Console.WriteLine("使用方法语法:");
foreach (int i in resultUsingMethodSyntax)
{
Console.WriteLine(i);
}

就是获取大于3的数,最后结果是一样的

让LINQ中的查询语法使用自定义的查询方法

从生成的IL代码可以看到,查询语法最终还是会使用方法语法

让LINQ中的查询语法使用自定义的查询方法

在这里,查询语法中的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>() { , , , };
//查询语法
var resultUsingQuerySyntax = from item in numberList
where item >
select item; //这里使用自定义的Where方法
//方法语法
var resultUsingMethodSyntax = numberList.Where(p => p > );//这里使用自定义的Where方法
Console.WriteLine("使用查询语法:");
foreach (int i in resultUsingQuerySyntax)
{
Console.WriteLine(i);
}
Console.WriteLine("使用方法语法:");
foreach (int i in resultUsingMethodSyntax)
{
Console.WriteLine(i);
}
}
}
}

对比前面那个,只是改了命名空间,看查询语法生成的IL代码,确实使用了自定义的Where方法

让LINQ中的查询语法使用自定义的查询方法

看下运行结果,也可以说明使用了自定义的Where方法

让LINQ中的查询语法使用自定义的查询方法