zoukankan      html  css  js  c++  java
  • 让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.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方法

    image

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

    image

  • 相关阅读:
    Dockerfile
    走进Docker
    liunx 设置定时任务
    《程序员自我修养》读书笔记
    Ubuntu换源
    liunx安装python2.7.12
    预习非数值数据的编码方式
    预习原码补码
    第三章预习
    预习非数值数据的编码方式
  • 原文地址:https://www.cnblogs.com/dandzm/p/4829939.html
Copyright © 2011-2022 走看看