让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 ...
随机推荐
- 实现网页页面跳转的几种方法大全(meta标签、js实现、php实现)
1.meta标签实现 只需在head里加上下面这一句就行了,在当前页面停留0.1秒后跳转到目标页面 代码如下 复制代码 1 <meta http-equiv="refresh&quo ...
- C#多线程(下) 分类: C# 线程 2015-03-09 10:41 153人阅读 评论(0) 收藏
四.多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线 ...
- 使用FileSystemWatcher监视文件变化
本文转载:http://www.cnblogs.com/zanxiaofeng/archive/2011/01/08/1930583.html FileSystemWatcher基础 属性: Path ...
- Linq中Union与Contact方法用法对比
文章一开始,我们来看看下面这个简单的实例. 代码片段1: int[] ints1 = { 2, 4, 9, 3, 0, 5, 1, 7 }; int[] ints2 = { 1, 3, 6, 4, 4 ...
- 让Hibernate生成的DDL脚本自动增加注释
我们知道可以通过Hibernate对象自动生成DDL建表语句,通过PowerDesigner工具可以反向工程生成数据字典,但是在生成的DDL中一直不能写上中文的注释,这就使我们生成的数据字典不具有可用 ...
- 设计模式22---设计模式之解释器模式(Interpreter)(行为型)
1.讲解解释器模式 1.1解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 1.2解释器模式要点 解析器:把描述客户端调用要求的表达式, ...
- php 总结
1.安装完apache之后 2.有一个目录 htdocs 下面就是根目录了 3.测试一下,新建一个index.html 写入 it works .输入localhost 看是否显示 it works ...
- [转] 使用Git进行小项目代码管理
http://www.uml.org.cn/pzgl/201206155.asp 之前在公司使用过SVN(无甚感觉)和ClearCase(把人恶心死的东西)两种版本控制工具,都不满意.后来想自己写点东 ...
- date和long的相互转换
import java.text.SimpleDateFormat; import java.util.Date; public class T { public static void main(S ...
- DataTable和List集合互转
/// <summary> /// 将集合转换成DataTable /// </summary> /// <param name="list"> ...