博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#学习笔记(九):LINQ和表达式树
阅读量:7009 次
发布时间:2019-06-28

本文共 3319 字,大约阅读时间需要 11 分钟。

LINQ

LINQ:语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。目前为止LINQ所支持的数据源有SQL Server、Oracle、XML(标准通用标记语言下的一个应用)以及内存中的数据集合。开发人员也可以使用其提供的扩展框架添加更多的数据源,例如MySQL、Amazon甚至是GoogleDesktop。

起源

.net的设计者在类库中定义了一系列的扩展方法来方便用户操作集合对象,而就是这些扩展方法构成了LINQ的查询操作符。

约束

LINQ的扩展方法都是针对实现IEnumerable接口的对象进行扩展的也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法。

语法

LINQ查询时有两种语法可供选择:查询表达式(Query Expression)和方法语法(Fluent Syntax)。

.NET公共语言运行库(CLR)并不具有查询表达式的概念。所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用。所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用。但另一方面,查询表达式通常会比较简单和易读。不管怎样,这两种语法是互相补充和兼容的,我们可以在一个查询中混合使用查询表达式和方法语法。

查询关键字

子句

说明

指定数据源和范围变量(类似于迭代变量)。

根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。

指定当执行查询时返回的序列中的元素将具有的类型和形式。

按照指定的键值对查询结果进行分组。

提供一个标识符,它可以充当对 join、group 或 select 子句的结果的引用。

基于元素类型的默认比较器按升序或降序对查询结果进行排序。

基于两个指定匹配条件之间的相等比较来联接两个数据源。

引入一个用于存储查询表达式中的子表达式结果的范围变量。

 子句中的上下文关键字。

 子句中的上下文关键字。

 子句中的上下文关键字。

 子句中的上下文关键字。

 子句中的上下文关键字。

 子句中的上下文关键字。

语法示例

下面提供查询表达式(Query Expression)和方法语法(Fluent Syntax)两种示例,实现的效果是取出数组中的偶数。

1 using System; 2 using System.Linq; 3  4 namespace Study 5 { 6     class Program 7     { 8         private static void Main(string[] args) 9         {10             //定义数据源11             int[] nums = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9};12 13 //使用查询表达式14 var queryResult1 = from num in nums where num % 2 == 0 select num;15 16 foreach (int num in queryResult1)17 {18 Console.Write("{0,1} ", num);19 }20 21 Console.WriteLine();22 23 //使用方法语法24 var queryResult2 = nums.Where(num => num % 2 == 0);25 26 foreach (int num in queryResult2)27 {28 Console.Write("{0,1} ", num);29 }30 31 Console.Read();32 }33 }34 }

使用LINQ操作XML

在C#3.0之前,使用的是System.Xml.XmlDocument来处理XML数据,操作稍显繁琐,下面我们看一个使用LINQ操作XML数据的例子:

1 using System; 2 using System.Linq; 3 using System.Xml.Linq; 4  5 namespace Study 6 { 7     class Program 8     { 9         private static string xmlString =10             "
" +11 "
" +12 "
张三
" +13 "
18
" +14 "
" +15 "
" +16 "
李四
" +17 "
28
" +18 "
" +19 "
" +20 "
王五
" +21 "
38
" +22 "
" +23 "
";24 25 private static void Main(string[] args)26 {27 XElement xmlDoc = XElement.Parse(xmlString);28 29 var queryResult = from element in xmlDoc.Elements("Person")30 where element.Element("Name").Value == "李四"31 select element;32 33 foreach (var xElement in queryResult)34 {35 Console.WriteLine("姓名: " + xElement.Element("Name").Value + ", Id为: " + xElement.Attribute("Id").Value);36 }37 38 Console.Read();39 }40 }41 }

LINQ的本质

LINQ在我们看来是添加了新的语法和特性,但其实对于编译器而言并没有添加任何新的东西,编写的LINQ查询语句其实在编译后会转变为编译器可以认识的Lambda表达式和扩展方法。

表达式树

表达式树是将Lambda表达式按树形结构来进行组合的一种数据结构,其主要作用是为了在LINQ中构造动态查询。

好文链接

转载地址:http://tuttl.baihongyu.com/

你可能感兴趣的文章
linux 处理键盘 鼠标事件
查看>>
不要返回null之EmptyFactory
查看>>
Unity strip engine code 遇到執行不能之問題與解決
查看>>
关于Excle中的VLookUp的函数的使用
查看>>
Azure China (10) 使用Azure China SAS Token
查看>>
Spring-AOP实践 - 统计访问时间
查看>>
电子技术·笔记6(2013-05\06)
查看>>
Makefile简易模板
查看>>
Windows Azure Storage (23) 计算Azure VHD实际使用容量
查看>>
压力测试工具Siege介绍
查看>>
ASP.NET如何调用MySQL的存储过程
查看>>
Visual Studio 进行Excel相关开发,Microsoft.Office.Interop.Excel.dll库
查看>>
swfdump——从内存中提取swf的工具
查看>>
【Javascript Demo】JS获取当前对象大小以及屏幕分辨率等
查看>>
Android去掉顶部的阴影
查看>>
卡尔曼滤波的原理说明
查看>>
C#对二进制文件的特定位置进行读写小结
查看>>
唯一不变的就是一直在变”--“数据”的华丽“变身术”
查看>>
编译器定义的C/C++语言各种基本数据类型的取值范围
查看>>
matlab 程序发布
查看>>