让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

posted @ 2015-09-22 18:29  dandzm  阅读(2796)  评论(0编辑  收藏  举报