让LINQ中的查询语法使用自定义的查询方法
使用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的数,最后结果是一样的

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

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

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

让LINQ中的查询语法使用自定义的查询方法的更多相关文章
- 关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法
该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译, ...
- kettle 在javascrip代码组件中使用fireToDB()函数实现自定义数据库查询
kettele里面的demo如下; var strConn = "MY Connection";var strSQL = "SELECT COUNT(*) FROM .. ...
- Linq中的in和not in的使用方法
T-SQL语句: select * from PayingRecords where ClientID='17787665-1d98-49e6-b254-a6a6553c4b42' and ID no ...
- .NET LINQ查询语法与方法语法
LINQ 查询语法与方法语法 通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...
- LINQ to Objects系列(2)两种查询语法介绍
LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查 ...
- 1-3 - C#语言习惯 - 推荐使用查询语法而不是循环
C#语言中并不缺少控制程序流程的结构,for.while.do-while和foreach等都可以做到这点. 历史上所有计算机语言设计者都不曾遗漏这些重要的循环控制结构. 不过我们还有一个更好的方式: ...
- Sliverlight linq中的数组筛选数据库中的数据
首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特 ...
- Solr常用查询语法笔记
1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...
- ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作
查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...
随机推荐
- 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
- nginx浏览pdf
location ~/M00{ # root /fdfs/storage/data; # if ($req ...
- java第四周学习
这一周学习的还是面向对象的方法和应用 Java中方法的使用和注意事项 如果没有返回值,就不允许通过return关键字返回结果 方法中不允许嵌套使用 Return返回值只允许返回一个值,不允许返回多个 ...
- ecshop获取客户端操作系统
<?php /** * 获得客户端的操作系统 * * @access private * @return void */ function get_os() { if (empty($_SERV ...
- head first-----decorate design pattern
浅谈设计模式之------装饰者模式 首先给出装饰者模式的定义吧: 动态的将责任附加到对象上,若是要扩展功能,装饰者提供了比继承更加具有弹性的替代方案. 其中 ...
- Cocos2d-x 3.0 红孩儿私家必修 - 第二章 cpp-empty-test
上一章我们讲到说曾经的HelloWorld演示更名为cpp-empty-test. 本章我们来分析一下 执行程序,我们能够看到熟悉的HelloWorld程序:与之前cocos2d-x2.x版本号的He ...
- List<T>分组一
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Qt5对Json的读写
主要任务:通过Qt5完成对Json格式的文件的读写操作. ①首先读取json文件进行解析 ②对读取出来的东西判断是QJsonObject还是QJsonArray类型③对相应的类型根据提供的key ...
- iOS-C文件添加到iOS项目中,运行报错
iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ...
- swift 关于delegate
Cocoa 开发中接口-委托 (protocol-delegate) 模式是一种常用的设计模式,它贯穿于整个 Cocoa 框架中,为代码之间的关系清理和解耦合做出了不可磨灭的贡献. 在 ARC 中,对 ...