首页 > 学院 > 开发设计 > 正文

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

2019-11-14 13:58:17
字体:
来源:转载
供稿:网友

使用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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表