你的位置:首页 > ASP.net教程

[ASP.net教程]让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的数,最后结果是一样的

image

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

image

在这里,查询语法中的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.Linqnamespace 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方法

image

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

image