使用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中的查询语法使用自定义的查询方法的更多相关文章

  1. 关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

    该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译, ...

  2. kettle 在javascrip代码组件中使用fireToDB()函数实现自定义数据库查询

    kettele里面的demo如下; var strConn = "MY Connection";var strSQL = "SELECT COUNT(*) FROM .. ...

  3. Linq中的in和not in的使用方法

    T-SQL语句: select * from PayingRecords where ClientID='17787665-1d98-49e6-b254-a6a6553c4b42' and ID no ...

  4. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

  5. LINQ to Objects系列(2)两种查询语法介绍

    LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查 ...

  6. 1-3 - C#语言习惯 - 推荐使用查询语法而不是循环

    C#语言中并不缺少控制程序流程的结构,for.while.do-while和foreach等都可以做到这点. 历史上所有计算机语言设计者都不曾遗漏这些重要的循环控制结构. 不过我们还有一个更好的方式: ...

  7. Sliverlight linq中的数组筛选数据库中的数据

    首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特 ...

  8. Solr常用查询语法笔记

    1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...

  9. ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作

    查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...

随机推荐

  1. winform清空DataGridView中的数据 分类: DataGridView 2014-05-19 20:56 180人阅读 评论(0) 收藏

    我们一般要把dgv情况,一般用: DataTable dt = (DataTable)dgvData.DataSource; dt.Rows.Clear(); dgvData.DataSource = ...

  2. LINQ多条件OR模糊查询

    本文章转载:http://www.cnblogs.com/guyun/archive/2012/10/18/2729888.html 需求是这样的,有一张表tbl(Key[int],Value[str ...

  3. javascript实现无缝上下滚动(转)

    js实现上下无缝滚动的原理是这样的: 1.首先给容器设定高度或宽度,然后overflow:hidden: 2.容器高度设定后,内容超出则被隐藏.3.改变容器的scrollTop(上下滚动)属性的值,让 ...

  4. Qt XML读取写入操作

    XML(eXtensible Markup Language,可扩展标记语言)是普通用于数据交换和数据存储的一种多用途文本文件格式: SVG(可标量矢量图形)XML格式,QtSvg模块提供了可用于载入 ...

  5. json-lib-2.4-jdk15.jar maven

    最近自己将一个web项目装换到使用mevan自动管理. 遇到了一个json包导入的问题.最终解决如下: <!-- https://mvnrepository.com/artifact/net.s ...

  6. Linux sed命令常用方法

    sed也成stream editor,流编辑器,是Linux上常用的文本处理工具. 通用格式:sed  行范围  模式/RegExp/  文件 模式: d 删除 p 打印符合条件的行 a \strin ...

  7. CTE在Oracle和Sqlserver中使用的差异

    CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...

  8. linux工具问题,tail -f 失效

    最近发现一个很奇怪问题: tail -f 不能实时的输出日志

  9. Win10安卓模拟器Visual Studio Emulator for Android使用简介(转)

    Visual Studio Emulator for Android是微软官方发布的独立版本的安卓模拟器,这款软件可以让安卓应用开发者更加轻松的用Visual Studio编写Android应用,据说 ...

  10. get 和 post的使用.

    Two commonly used methods for a request-response between a client and server are: GET and POST. GET  ...