第4章 LINQ查询大全
Linq专题之Linq查询from子句
Linq专题之Linq查询from⼦句 Linq查询表达式包含8个常⽤的⼦句:from、where、select、join、into、orderby、group、let。
我们来看看详细的说明。
from: 指定查询操作的数据源和范围变量 where:筛选元素的逻辑条件,⼀般由逻辑运算符("与","或")组成 select: 指定查询结果的类型和表现形式 orderby: 对查询结果进⾏排序,可以升序也可以降序 group:对查询结果进⾏分组 into:提供⼀个临时标识符,该标识符可以充当对join、group或select⼦句的结果的引⽤ join:连接多个查询操作的数据源 let:引⼊⽤于存储查询表达式中的⼦表达式结果的范围变量 Linq的查询表达式必须以 from⼦句开头,并且以select或group⼦句结束。
在第⼀个from⼦句和最后⼀个select或group⼦句之间,查询表达式可以包含⼀个或多个where、orderby、group、join、let⼦句,甚⾄from⼦句。
另外,join和group⼦句还可以使⽤into⼦句指定临时标识符号。
我们来看看下⾯的⼀个简单的查询表达式:1private void LinqTest()2 {3int[] values = {0,1,2,3,4,5,6,7,8,9};45var result = from v in values6where v > 37select v;8 }下⾯我们就来逐⼀的讲解⼀下这8个⼦句的⽤法。
1、from⼦句 linq查询表达式必须包含from⼦句且以from⼦句开头,如果该查询中包含⼦查询,那么⼦查询也必须以from⼦句开头。
from⼦句指定查询操作的数据源和范围变量,数据源包括本⾝和⼦查询的数据源,范围变量表⽰源序列中的每⼀个元素。
上⾯的简单查询例⼦中,是存数组values中查询出⼤于3的元素,其中values就是数据源,v就是变量范围,即表⽰values中的每⼀个元素。
Linq查询用法
create database [UserInfo]gouse UserInfogoif exists(select * from sysobjects where name='Person') drop table Persongocreate table Person(Id int identity(1,1) not null primary key,Name nvarchar(50),Sex bit,Age int);goinsert into Person values('aa',0,23);insert into Person values('bb',1,21);insert into Person values('cc',0,26);insert into Person values('dd',0,33);insert into Person values('ee',1,19);insert into Person values('ff',0,44);insert into Person values('gg',0,18);goselect * from Person//查询所有的信息Persons.Select(p =>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age})//查询指定字段的信息Persons.Select(p=>newName = ,Sex = p.Sex})//查询所有性别为男的信息Persons.Where(p=>p.Sex==true).Select(p =>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age})//查询所有性别为男的信息按年龄降序排序,默认升序Persons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select (p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age})//查询用户名为包含a的唯一值Persons.Where(p=>=="aa").OrderByDescending(p=>p.Age).Select (p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Distinct()//查询第一条数据一般返回实体类没有数据返回nullPersons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select (new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).FirstOrDefault()//查询第一条数据一般返回实体类没有数据会报错Persons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select (p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).First()//查询性别为男的人数Persons.Where(p=>p.Sex==true).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Count()//查询性别为男的总年龄Persons.Where(p=>p.Sex==true).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Sum(p=>p.Age)//查询性别为男的最大年龄Persons.Where(p=>p.Sex==true).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Max(p=>p.Age)//查询性别为男的最小年龄Persons.Where(p=>p.Sex==true).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Min(p=>p.Age)//查询性别为男的平均值Persons.Where(p=>p.Sex==true).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Average(p=>p.Age)//查出性别为男年龄从大到小前3条的数据Persons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select( p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Take(3)//分页PageIndex为当前页,PageSize为显示的数量Persons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select( p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Skip((1-1)*2).Take(2)//分页公式Persons.Where(p=>p.Sex==true).OrderByDescending(p=>p.Age).Select(p=>new{Id = p.Id,Name = ,Sex = p.Sex,Age = p.Age}).Skip((PageIndex-1)*PageSize).Take(PageSize)//按id分组性别为男,数量大于等于1 查询编号,数量,平均数,最大值,最小值,和Persons.Where(p=>p.Sex==true).GroupBy (p => p.Id).Where (g => (g.Count () >=1)) .OrderByDescending(g=>g.Average(p=>p.Age)).Select(g =>new{PersonsId=g.Key,PersonsCount = g.Count(),PersonsAvg=g.Average(p=>p.Age),PersonsSum=g.Sum(p=>p.Age),PersonsMax=g.Max(p=>p.Age),PersonsMin=g.Min(p=>p.Age)})//无条件的多表查询joinPersons.Join(Cards,pp => (Int32?)(pp.Id),cc => erId,(pp, cc) =>new{Id = pp.Id,Name=,type=})//有条件的多表查询Persons.Join(Cards,a => (Int32?)(a.Id),b => erId,(a, b) =>new{a = a,b = b}).Where (temp => ( == "中国农业银行")).Select (temp =>new{id = temp.a.Id,name = ,userName=})。
C#基础教程 LINQ 查询、筛选、排序
var queryAllCustomers = from cust in customers select cust; 范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上 不发生迭代。执行查询时,范围变量将用作对 customers 中的每个后续 元素的引用。因为编译器可以推断 cust 的类型,所以我们不必显式指定 此类型。其他范围变量可由 let 子句引入。
C#基础教程 LINQ 查询、筛选、排序
13.3 基本查询操作 13.3.1 获取数据源 在 LINQ 查询中,第一步是指定数据源。像在大多数编程语言中一样, 在 C# 中,必须先声明变量,才能使用它。在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 (customers) 和范围变量 (cust)。
注意:对于非泛型数据源(如 ArrayList),必须显式类型化范围变量。 13.3.2 筛选 也许最常用的查询操作是应用布尔表达式形式的筛选器。此筛选器使查 询只返回那些表达式结果为 true 的元素。使用 where 子句生成结果。
实际上,筛选器指定从源序列中排除哪些元素。在下面的示例中,只返 回那些地址位于伦敦的 customers。 var queryLondonCustomers = from cust in customers where cust.City == "London" select cust;
ห้องสมุดไป่ตู้
我们可以使用熟悉的 C# 逻辑 AND 和 OR 运算符来根据需要在 where 子 句中应用任意数量的筛选表达式。例如,若要只返回位于“伦敦”AND 姓名为“Devon”的客户,我们应编写下面的代码:
where cust.City=="London" && == "Devon" 若要返回位于伦敦或巴黎的客户,我们应编写下面的代码: where cust.City == "London" || cust.City == "Paris"
LinQ查询语言
语言集成查询(LINQ)课程大纲•什么是LINQ?•查询基本操作(查询关键字)– from子句– where子句– select子句– group子句– into子句– orderby子句– join子句2什么是LINQ?•传统的查询Select FirstName,LastName from Customers Where city=‘Shanghai’Order by district1、简单的字符串。
2、没有编译时候的类型检查。
3、没有IDE编译环境的只能感知。
以上的例子只是针对SQLSERVER,针对不同的数据源,例如XML 文档、各种Web 服务等我们还要学习不同的查询方法………3什么是LINQ?•LINQ是语言集成查询(Language Integrated Query)的简称,是Visual Studio 2008 和.NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁•支持各种数据源4什么是LINQ?•所有LINQ 查询操作都由以下三个不同的操作组成– 获取数据源– 创建查询– 执行查询5数据源•数据源–在上一个示例中,由于数据源是数组,因此它隐式支持泛型IEnumerable(T)接口。
这一事实意味着该数据源可以用LINQ 进行查询。
–在foreach 语句中执行查询,而foreach 要求使用IEnumerable或Ienumerable(T)。
支持Ienumerable(T)或派生接口(如泛型Iqueryable(T)的类型称为“可查询类型”。
6创建查询•查询–查询指定要从数据源中检索的信息–查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化–查询存储在查询变量中,并用查询表达式进行初始化。
为使编写查询的工作变得更加容易,C# 引入了新的查询语法7执行查询•执行查询–延迟执行:询变量本身只是存储查询命令。
实际的查询执行会延迟到在foreach 语句中循环访问查询变量时发生。
目前本人收集的最全的LINQ入门资料大家一起LINQ吧
目前本人收集的最全的LINQ入门资料大家一起LINQ吧入门教程系列1LinqtoSql(一):DataConte某t与实体LinqtoSql(二):增删改LinqtoSql(三):查询句法LinqtoSql(四):存储过程LinqtoSql(五):探究特性LinqtoSql(六):并发与事务LinqtoSql(七):继承与关系Linqtoql(八):其它入门教程系列2LINQ体验(1)——ViualStudio2022新特性我平时利用课余零碎时间来学习3.5、LINQ、Silverlight、3.5E某tenion等新东西,通过笔记形式来记录自己所学的历程,也给大家一起学习ViualStudio2022和.NET3.5提供一个平台,为保证此系列的完整性,我打算先依次介绍一下C#3.0新语言特性和改进,然后从一条一条LINQ语句分析来贯穿LINQ的知识点……LINQ体验(2)——C#3.0新语言特性和改进(上篇)LINQ体验(3)——C#3.0新语言特性和改进(下篇)LINQ体验(4)——LINQ简介和LINQtoSQL语句之WhereLINQ是LanguageIntegratedQuery的简称,它是集成在.NET编程语言中的一种特性。
已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。
并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
…LINQ体验(5)——LINQtoSQL语句之Select/Ditinct和Count/Sum/Min/Ma某/AvgLINQ体验(6)——LINQtoSQL语句之Join和OrderByLINQ体验(7)——LINQtoSQL语句之GroupBy/Having和E某it/In/Any/All/Contain我们继续讲解LINQtoSQL语句,这篇我们来讨论GroupBy/Having操作符和E某it/In/Any/All/Contain操作符。
C#编程LINQ查询
C#编程LINQ查询LINQ查询表达式约束LINQ查询表达式必须以from⼦句开头,以select或group⼦句结束关键字from...in...:指定要查找的数据以及范围变量,多个from⼦句则表⽰从多个数据源查找数据。
注意:C#编译器会把"复合from⼦句"的查询表达式转换为SelectMany()扩展⽅法join...in...on...equals...:指定多个数据源的关联⽅式let:引⼊⽤于存储查询表达式中⼦表达式结果的范围变量,通常能达到层次感会更好,使代码更易于⽉的orderby、descending:指定元素的排序字段和排序⽅式,当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序⽅式where:指定元素的筛选条件,多个where⼦句则表⽰了并列条件,必须全部都满⾜才能⼊选,每个where⼦句可以使⽤&&、||连接多个条件表达式group:指定元素的分组字段select:指定查询要返回的⽬标数据,可以指定任何类型,甚⾄是匿名类型(⽬前通常被指定为匿名类型)into:提供⼀个临时的标识符,该标识符可以引⽤join、group和select⼦句的结果。
(1)直接出现在join⼦句之后的into关键字会被翻译为GroupJoin。
(2)select或group⼦句字后的into它会重新开始⼀个查询,让我们可以继续引⼊where、orderby和select⼦句,它是对分步构建查询表达式的⼀种简写⽅式。
下⾯通过⼀个案例来学习对两张表进⾏查询using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武林⾼⼿/// </summary>class MartialArtsMaster {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Menpai { get; set; }public string Kongfu { get; set; }public int Level { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Age: {2}, Menpai: {3}, Kongfu: {4}, Level: {5}", Id, Name, Age, Menpai, Kongfu, Level);}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武学/// </summary>class Kongfu {public int Id { get; set; }public string Name { get; set; }public int Power { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Power: {2}", Id, Name, Power);}}}using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace _013_LINQ{internal class Program{private static void Main(string[] args){//初始化武林⾼⼿var masterList = new List<MartialArtsMaster>(){new MartialArtsMaster() {Id = 1, Name = "黄蓉", Age = 18, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 9},new MartialArtsMaster() {Id = 2, Name = "洪七公", Age = 70, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 10},new MartialArtsMaster() {Id = 3, Name = "郭靖", Age = 22, Menpai = "丐帮", Kongfu = "降龙⼗⼋掌", Level = 10},new MartialArtsMaster() {Id = 4, Name = "任我⾏", Age = 50, Menpai = "明教", Kongfu = "葵花宝典", Level = 1},new MartialArtsMaster() {Id = 5, Name = "东⽅不败", Age = 35, Menpai = "明教", Kongfu = "葵花宝典", Level = 10},new MartialArtsMaster() {Id = 6, Name = "林平之", Age = 23, Menpai = "华⼭", Kongfu = "葵花宝典", Level = 7},new MartialArtsMaster() {Id = 7, Name = "岳不群", Age = 50, Menpai = "华⼭", Kongfu = "葵花宝典", Level = 8},new MartialArtsMaster() {Id = 8, Name = "令狐冲", Age = 23, Menpai = "华⼭", Kongfu = "独孤九剑", Level = 10},new MartialArtsMaster() {Id = 9, Name = "梅超风", Age = 23, Menpai = "桃花岛", Kongfu = "九阴真经", Level = 8},new MartialArtsMaster() {Id = 10, Name = "黄药师", Age = 23, Menpai = "梅花岛", Kongfu = "弹指神通", Level = 10},new MartialArtsMaster() {Id = 11, Name = "风清扬", Age = 23, Menpai = "华⼭", Kongfu = "独孤九剑", Level = 10}};//初始化武学var kongfuList = new List<Kongfu>(){new Kongfu() {Id = 1, Name = "打狗棒法", Power = 90},new Kongfu() {Id = 2, Name = "降龙⼗⼋掌", Power = 95},new Kongfu() {Id = 3, Name = "葵花宝典", Power = 100},new Kongfu() {Id = 4, Name = "独孤九剑", Power = 100},new Kongfu() {Id = 5, Name = "九阴真经", Power = 100},new Kongfu() {Id = 6, Name = "弹指神通", Power = 100}};}上⾯定义了两个类,武林⾼⼿和武学,现在我们查询所有武学级别⼤于8且门派为丐帮的武林⾼⼿。
linq查询语句语法详解-Linq语法
Linq查询语法介绍2010Linq查询介绍 (1)LINQ查询 (1)LINQ查询select描述:查询顾客的公司名、地址信息查询句法:对应SQL:描述:查询职员的姓名和雇用年份查询句法:对应SQL:描述:查询顾客的ID以及联系信息(职位和联系人)查询句法:对应SQL:描述:查询订单号和订单是否超重的信息查询句法:对应SQL:where描述:查询顾客的国家、城市和订单数信息,要求国家是法国并且订单数大于5 查询句法:对应SQL:orderby描述:查询所有没有下属雇员的雇用年和名,按照雇用年倒序,按照名正序查询句法:对应SQL:分页描述:按照每页10条记录,查询第二页的顾客查询句法:对应SQL:分组描述:根据顾客的国家分组,查询顾客数大于5的国家名和顾客数查询句法:对应SQL:描述:根据国家和城市分组,查询顾客覆盖的国家和城市查询句法:对应SQL:描述:按照是否超重条件分组,分别查询订单数量查询句法:对应SQL:distinct描述:查询顾客覆盖的国家查询句法:对应SQL:union描述:查询城市是A打头和城市包含A的顾客并按照顾客名字排序查询句法:对应SQL:concat描述:查询城市是A打头和城市包含A的顾客并按照顾客名字排序,相同的顾客信息不会过滤查询句法:对应SQL:取相交项描述:查询城市是A打头的顾客和城市包含A的顾客的交集,并按照顾客名字排序查询句法:对应SQL:排除相交项描述:查询城市包含A的顾客并从中删除城市以A开头的顾客,并按照顾客名字排序查询句法:对应SQL:子查询描述:查询订单数超过5的顾客信息查询句法:对应SQL:in操作描述:查询指定城市中的客户查询句法:对应SQL:join描述:内连接,没有分类的产品查询不到查询句法:对应SQL:描述:外连接,没有分类的产品也能查询到查询句法:对应SQL:你可能会很奇怪,原先很复杂的SQL使用查询句法会很简单(比如按照条件分组)。
但是原先觉得很好理解的SQL使用查询句法会觉得很复杂(比如连接查询)。
LINQ用法大全
var books = from book in SampleData.Books select new { Title = book.Title, Publisher = , Author = book.Authors.First().LastName };
处理结果为 8。即有 8 个非字母字符。
可能你也注意到了,在 string 的只能语法提示中没有 IEnumerable<T>的扩展方法。但是, 我们还是可以使用它们。
除了上面提到的数据、泛型 List、泛型字典和字符串以外,其他实现了 IEnumerable<T> 的结合都可以使用 LINQ 来查询。对于实现了非泛型的 IEnumerable 集合,如:DataSet 和 ArrayList 等,我们也可以使用 LINQ 查询,但是需要做一些特殊处理。后面将会提到。
var evenNumbers = from item in frenchNumbers where item.Key % 2 == 0 select item.Value;
处理结果为:
Zero deux quatre
字符串 通常,字符串并不当成一个集合。但实际上.NET 的字符串实现了 IEnumerable<Char>接
泛型 List 在.NET 中使用最为广泛的集合无疑是泛型的 List。泛型的 List 包括:
System.Collections.Generic.List<T> System.Collections.Generic.LinkedList<T> System.Collections.Generic.Queue<T> System.Collections.Generic.Stack<T> System.Collections.Generic.HashSet<T> System.Collections.ObjectModel.Collection<T> ponentModel.BindingList<T>
Linq查询操作之聚合操作(count,max,min,sum,average,aggre。。。
Linq查询操作之聚合操作(count,max,min,sum,average,aggre。
在Linq中有⼀些这样的操作,根据集合计算某⼀单⼀值,⽐如集合的最⼤值,最⼩值,平均值等等。
Linq中包含7种操作,这7种操作被称作聚合操作。
1、Count操作,计算序列中元素的个数,或者计算满⾜⼀定条件的元素的个数2、Sum操作,计算序列中所有元素的值的总和3、Max操作,计算序列中元素的最⼤值4、Min操作,计算序列中元素的最⼩值5、Average操作,计算序列中所有元素的平均值6、Aggregate操作,对集合中的元素进⾏⾃定义的聚合计算7、LongCount操作,计算集合中的元素的数量,或者满⾜⼀定条件的元素的数量,⼀般⽤来计算⼤型集合中元素的数量下⾯我们就来对这些聚合操作来做逐⼀的分析。
Count操作 Count操作是⽤来计算序列中元素的数量或者满⾜⼀定条件的元素的数量。
Count()⽅法的原型:public static int Count<TSource>(this IEnumerable<TSource> source);public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);Count⽅法有2个原型,第⼀个只是单独的计算序列中的元素的数量总和,第⼆个原型有⼀个委托函数,⽤来筛选满⾜⼀定条件的元素,然后再计算满⾜条件的数量和。
下⾯我们举个例⼦来说明:1private void CountQuery()2 {3int[] ints = new int[] { 1,2,3,4,5,6,7 };456var result = ints.Count();7var result2 = ints.Count(x => x > 4);89 Response.Write(result + "</br>");1011 Response.Write(result2 + "</br>");1213 }这个例⼦中result是计算ints数组的总数量,result计算的是ints中元素值⼤于4的元素个数。
LINQ 查询介绍
来源:msdn时间:2008-09-26 阅读:4751 次原文链接[收藏][1] LINQ 查询介绍[2] LINQ 查询介绍[3] LINQ 查询介绍查询是一种从数据源检索数据的表达式。
查询通常用专门的查询语言来表示。
随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的SQL 和用于XML 的XQuery。
因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。
LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。
在LINQ 查询中,始终会用到对象。
可以使用相同的基本编码模式来查询和转换XML 文档、SQL 数据库、 数据集、.NET 集合中的数据以及对其有LINQ 提供程序可用的任何其他格式的数据。
查询操作的三个部分所有LINQ 查询操作都由以下三个不同的操作组成:∙获取数据源。
∙创建查询。
∙执行查询。
下面的示例演示如何用源代码表示查询操作的三个部分。
为了方便起见,此示例将一个整数数组用作数据源;但其中涉及的概念同样适用于其他数据源。
本主题的其余部分也会引用此示例。
class IntroToLINQ{static void Main(){// The Three Parts of a LINQ Query:// 1. Data source.int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6};// 2. Query creation.// numQuery is an IEnumerable<int>var numQuery =from num in numberswhere(num % 2) == 0select num;// 3. Query execution.foreach(int num in numQuery){Console.Write("{0,1} ", num);}}}下图显示了完整的查询操作。
c#初学-LINQ查询表达式基础
c#初学-LINQ查询表达式基础“查询”是指一组指令,这些指令描述要从一个或多个给定数据源检索的数据以及返回的数据应该使用的格式和组织形式。
查询不同于它所产生的结果。
通常,源数据会在逻辑上组织为相同种类的元素序列。
SQL 数据库表包含一个行序列。
与此类似,DataRow 包含一个DataTable 对象序列。
在XML 文件中,有一个XML 元素“序列”(不过这些元素按分层形式组织为树结构)。
内存中的集合包含一个对象序列。
从应用程序的角度来看,原始源数据的具体类型和结构并不重要。
应用程序始终将源数据视为一个IEnumerable(Of T) 或IQueryable(Of T) 集合。
在LINQ to XML 中,源数据显示为一个IEnumerable<XElement>。
在LINQ to DataSet 中,它是一个IEnumerable<DataRow>。
在LINQ to SQL 中,它是您定义用来表示SQL 表中数据的任何自定义对象的IEnumerable 或IQueryable。
指定此源序列后,查询可以进行下列三项工作之一:检索一个元素子集以产生一个新序列,但不修改单个元素。
然后,查询可以按各种方式对返回的序列进行排序或分组,如下面的示例所示(假定scores 是int[]):IEnumerable<int> highScoresQuery = from score in scoreswhere score > 80orderby score descendingselect score;如上一个示例所述检索一个元素序列,但是将这些元素转换为具有新类型的对象。
例如,查询可以只从数据源中的某些客户记录检索姓氏。
或者,查询可以检索完整的记录,再使用它构建另一个内存中对象类型甚至XML 数据,然后生成最终的结果序列。
C#中Linq查询基本操作
C#中Linq查询基本操作摘要:本⽂介绍Linq查询基本操作(查询关键字)- from ⼦句- where ⼦句- select⼦句- group ⼦句- into ⼦句- orderby ⼦句- join ⼦句- let ⼦句- 复合from⼦句- 在某些情况下,源序列中的每个元素本⾝可能是序列(集合),也可能包含序列- ⽤语访问单个数据库中的内部集合- 使⽤多个from字句执⾏连接- 可以包含多个可从独⽴数据源⽣成补充查询的from字句复合(顾名思义就是有多from的字句)实例:class Program{static void Main(string[] args){List<Student> students = new List<Student>{new Student{LastName="xiaogui",Scores=new List<int>{97,42,91,60}},new Student{LastName="xiaozhan",Scores=new List<int>{50,92,81,60}},new Student{LastName="xiaolan",Scores=new List<int>{32,32,81,90}},new Student{LastName="xiaowan",Scores=new List<int>{92,22,81,60}},};var query = from stuent in studentsfrom score in stuent.Scoreswhere score > 90select new{Last = stName,score};foreach (var student in query)//⼤于90分的显⽰出来{Console.WriteLine("{0} Score:{1}", st, student.score);}Console.ReadLine();}}public class Student{public string LastName { get; set; }public List<int> Scores { get; set; }}public class Employee{public string First { get; set; }public string Last { get; set; }public int ID { get; set; }}执⾏结果: xiaogui Score:97xiaogui Score:91xiaozhan Score:92xiaowan Score:92let 关键字(使⽤let字句扩展范围变量)- 创建⼀个可以查询⾃⾝的可枚举类型- 使查询只能对范围变量word调⽤⼀次ToLower。
Linq查询简介
LINQLINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。
它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
基本概念从技术角度而言,LINQ定义了大约40个查询操作符,如select、from、in、where以及orderby(C#)中。
试用这些操作可以编写查询语句。
不过,这些查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。
经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。
程序员现在都已经认同像类(classes)、对象(objects)、方法(methods)这样的语言特性。
考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。
其中两个最主要访问的数据源与数据库( database )和 XML 相关。
LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。
这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。
包含 DLinq 和 XLinq基础知识1. LINQ的读法:(1)lin k (2)lin q2. LINQ的关键词:from, select, in, where, group by, order by …3. LINQ的注意点:必须以select或者是group by 结束。
c#Linq查询
c#Linq查询c#提供的ling查询极⼤的遍历了集合的查询过程,且使⽤简单⽅便,⾮常的有⽤。
下⾯将分别⽤简单的例⼦说明:ling基本查询、延迟查询属性、类型筛选、复合from字句、多级排序、分组查询、联合查询、合并、分页、聚合操作符、并⾏linq、取消长时间运⾏的并⾏ling查询。
Lambda表达式简介:/*Lambda表达式:Lambda 表达式是⼀种可⽤于创建委托或表达式⽬录树类型的匿名函数表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。
* (input parameters) => expression* ⽰例:*/delegate int del(int i);static void Main(string[] args){del myDelegate = x => x * x;int j = myDelegate(5); //最后j = 25}基本查询语句:var query = from r in listStudents where r.score < 60orderby r.score descending select r;//var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使⽤Lambda表达式例⼦:///<summary>///学⽣结构体///</summary>struct Student{///<summary>///姓名///</summary>public string name;///<summary>///年龄///</summary>public int age;///<summary>///班号///</summary>public int grade;///<summary>///分数///</summary>public float score;}///<summary>/// linq///基本查询///</summary>static void Linq1(){#region构造查询数据List<Student> listStudents = new List<Student>();Random pRandom = new Random();for (int i = 1; i < 50; i++){float sc = pRandom.Next(0, 100);int age = pRandom.Next(8, 13);int gde = pRandom.Next(1, 6);string name = "";switch (pRandom.Next(0, 6)){case1: name = "周xxx"; break;case2: name = "李xxx"; break;case3: name = "孙xxx"; break;case4: name = "钱xxx"; break;default: name = "赵xxx"; break;}Student psdt = new Student(); = name;psdt.age = age;psdt.grade = gde;psdt.score = sc;listStudents.Add(psdt);}#endregion//从50个学⽣中选择出不及格的⼈员名单并按分数降序排列var query = from r in listStudents where r.score < 60orderby r.score descending select r;//var q2 = listStudents.Where(r => r.score < 60).OrderByDescending(r => r.score).Select(r => r) ;//或使⽤Lambda表达式 //orderby升序即从⼩到⼤,orderby r.score descending降序即从⼤到⼩Console.WriteLine("不及格的⼈员名单:");foreach (Student st in query){Console.WriteLine("***************");Console.WriteLine("姓名:"+);Console.WriteLine("班级:"+st.grade);Console.WriteLine("年龄:"+st.age);Console.WriteLine("分数:"+st.score);}Console.ReadKey();}View Code延迟查询属性linq查询为延迟查询,只需构造⼀次查询语句,可以多次使⽤。
[全]C#.NET-LINQ查询
C#.NET-LINQ查询在C# 中,从功能上LINQ 可分为两类:LINQ to Object 和LINQ to XML;从语法上LINQ 可以分为LINQ to Object 和LINQ 扩展方法。
大多数LINQ to Object 都可以用LINQ 扩展方法实现等同的效果,而且平时开发中用的最多的是LINQ 扩展方法。
LINQ to Object 多用于映射数据库的查询,LINQ to XML 用于查询XML 元素数据。
使用LINQ 查询的前提是对象必须是一个IEnumerable 集合(注意,为了描述方便,本文说的集合都是指IEnumerable 对象,包含字面上的ICollection 对象)。
另外,LINQ 查询大多是都是链式查询,即操作的数据源是IEnumerable<T1> 类型,返回的是IEnumerable<T2> 类型。
形如下面这样的查询就是LINQ to Object:等同于使用下面的LINQ 扩展方法:LINQ 查询支持在语句中间根据需要定义变量,比如取出数组中平方值大于平均值的数字:其中的Select 方法接收的参数用的最多的是Func<TSource, TResult>,它还可以接收Func<TSource, int, TResult> 参数,示例:再来看一下LINQ to XML 的示例。
假如我们有如下XML 文件:使用LINQ to XML 查询所有含有指定节点值的元素:等同于使用LINQ 扩展方法:LINQ to XML 操作XML 非常方便和灵活,大家可以在具体使用的时候去探索,这里就不展开讲了。
LINQ 查询有很多方法,由于篇幅原因,就不一一列举演示了,这里只选取一些强大的查询方法,这些方法若使用非LINQ 来实现可能会比较麻烦。
LINQ 之所以强大,是因为它可以轻松实现复杂的查询,下面我们来总结一下C# LINQ 的强大之处。
LINQ的组合查询
LINQ的组合查询、自定义组合排序功能的演示:TrackInfo.cs文件内容:using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;///<summary>///TrackInfo 的摘要说明///</summary>public class TrackInfo{public TrackInfo(){}public TrackInfo(int rowNo, int status, DateTime endDate, DateTime finishDate) {this.RowNo = rowNo;this.Status = status;this.EndDate = endDate;this.FinishDate = finishDate;}public int RowNo { get; set; }public int Status { get; set; }public DateTime EndDate { get; set; }public DateTime FinishDate { get; set; }}Track.cs文件内容:using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Collections;using System.Collections.Generic;///<summary>///Track 的摘要说明///</summary>public class Track{public IList<TrackInfo> GetTrackList(){List<TrackInfo> list = new List<TrackInfo>();list.Add(new TrackInfo(1, 0, DateTime.Parse("1900-1-1"), DateTime.Parse("1900-1-1"))); list.Add(new TrackInfo(2, 1, DateTime.Parse("2010-4-1"), DateTime.Parse("2010-4-8"))); list.Add(new TrackInfo(3, 0, DateTime.Parse("2010-5-1"), DateTime.Parse("2010-5-8"))); list.Add(new TrackInfo(4, 1, DateTime.Parse("2010-6-1"),DateTime.Parse("2010-6-10")));list.Add(new TrackInfo(5, 2, DateTime.Parse("2010-6-7"), DateTime.Parse("2010-6-9"))); list.Add(new TrackInfo(6, 2, DateTime.Parse("2010-6-7"), DateTime.Parse("2010-6-9")));return list;}}StringFieldNameSortingSupport.cs文件内容:using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Linq.Expressions;using System.Reflection;///<summary>///字符串排序///</summary>public static class StringFieldNameSortingSupport{#region Private expression tree helpersprivate static LambdaExpression GenerateSelector<TEntity>(String propertyName, out Type resultType) where TEntity : class{// Create a parameter to pass into the Lambda expression (Entity => Entity.OrderByField).var parameter = Expression.Parameter(typeof(TEntity), "Entity");// create the selector part, but support child propertiesPropertyInfo property;Expression propertyAccess;if (propertyName.Contains('.')){// support to be sorted on child fields.String[] childProperties = propertyName.Split('.');property = typeof(TEntity).GetProperty(childProperties[0]);propertyAccess = Expression.MakeMemberAccess(parameter, property);for (int i = 1; i < childProperties.Length; i++){property = property.PropertyType.GetProperty(childProperties[i]);propertyAccess = Expression.MakeMemberAccess(propertyAccess, property);}}else{property = typeof(TEntity).GetProperty(propertyName);propertyAccess = Expression.MakeMemberAccess(parameter, property);}resultType = property.PropertyType;// Create the order by expression.return mbda(propertyAccess, parameter);}private static MethodCallExpression GenerateMethodCall<TEntity>(IQueryable<TEntity> source,string methodName, String fieldName) where TEntity : class{Type type = typeof(TEntity);Type selectorResultType;LambdaExpression selector = GenerateSelector<TEntity>(fieldName, outselectorResultType);MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { type, selectorResultType }, source.Expression, Expression.Quote(selector));return resultExp;}#endregionpublic static IOrderedQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string fieldName) where TEntity : class{MethodCallExpression resultExp = GenerateMethodCall<TEntity>(source, "OrderBy", fieldName);return source.Provider.CreateQuery<TEntity>(resultExp) as IOrderedQueryable<TEntity>; }public static IOrderedQueryable<TEntity> OrderByDescending<TEntity>(thisIQueryable<TEntity> source, string fieldName) where TEntity : class{MethodCallExpression resultExp = GenerateMethodCall<TEntity>(source, "OrderByDescending", fieldName);return source.Provider.CreateQuery<TEntity>(resultExp) as IOrderedQueryable<TEntity>; }public static IOrderedQueryable<TEntity> ThenBy<TEntity>(this IOrderedQueryable<TEntity> source, string fieldName) where TEntity : class{MethodCallExpression resultExp = GenerateMethodCall<TEntity>(source, "ThenBy", fieldName);return source.Provider.CreateQuery<TEntity>(resultExp) as IOrderedQueryable<TEntity>; }public static IOrderedQueryable<TEntity> ThenByDescending<TEntity>(this IOrderedQueryable<TEntity> source, string fieldName) where TEntity : class{MethodCallExpression resultExp = GenerateMethodCall<TEntity>(source, "ThenByDescending", fieldName);return source.Provider.CreateQuery<TEntity>(resultExp) as IOrderedQueryable<TEntity>; }public static IOrderedQueryable<TEntity> OrderUsingSortExpression<TEntity>(this IQueryable<TEntity> source, string sortExpression) where TEntity : class{String[] orderFields = sortExpression.Split(',');IOrderedQueryable<TEntity> result = null;for (int currentFieldIndex = 0; currentFieldIndex < orderFields.Length; currentFieldIndex++){String[] expressionPart = orderFields[currentFieldIndex].Trim().Split(' ');String sortField = expressionPart[0];Boolean sortDescending = (expressionPart.Length == 2) &&(expressionPart[1].Equals("DESC", StringComparison.OrdinalIgnoreCase));if (sortDescending){result = currentFieldIndex == 0 ? source.OrderByDescending(sortField) : result.ThenByDescending(sortField);}else{result = currentFieldIndex == 0 ? source.OrderBy(sortField) :result.ThenBy(sortField);}}return result;}}Default.aspx.cs文件内容:using System;using System.Collections;using System.Configuration;using System.Data;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Data.SqlClient;using System.Reflection;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;public partial class_Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){int status = -1;DateTime? endDateFrom = null;DateTime? endDateTo = null;DateTime? finishDateFrom = null;DateTime? finishDateTo = null;endDateFrom = DateTime.Parse("2000-6-1");rpt.DataSource = GetTrackList(3, "FinishDate desc, RowNo desc", status, endDateFrom, endDateTo, finishDateFrom, finishDateTo);rpt.DataBind();}///<summary>///获取跟踪信息列表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 4 章 LINQ 查询基础
IQueryable<T>的对象,可以对它进行枚举,遍历每一个元素。此外,它的元素可 以是任何数据类型,所以可以表示任何数据的集合。 目标数据:数据源中的元素并不定是查询所需要的结果。例如,对于一个学生信 息集合中,查询 A 只是查询学生的姓名,查询 B 要查询学生的姓名和各科成绩, 查询 C 则需要学生各科成绩的总分(需要另外计算),而不是原始数据中的各科 成绩。目标数据用来指定查询的具体想要的是什么数据。在 LINQ 中,它定义了 查询结果数据集中元素的具体类型。 筛选条件:筛选条件定义了对数据源中元素的过滤条件。只有满足条件的元素才 作为查询结果返回。筛选条件可以是简单的逻辑表达式表示,也可以用具有复杂 逻辑的函数来表示。 附加操作:附加操作表示一些其他的具体操作。比如,对查询结果进行排序、计 算查询结果的最值和求和、对查询结果进行分组等。 其中,数据源和目标数据是 LINQ 查询的必备元素,筛选条件和附加操作是可选元素。 比如,示例代码 4-1 中的查询 query1 就只包含了数据源和目标数据两个必备元素。本章后 面的章节将进一步介绍 LINQ 查询的具体使用方法。
通常,针对数据的查询是用简单的字符串文本来编写的查询语句,比如传统的 SQL 查 询语句,没有编译时的类型检查,安全性、方便性都不好。此外,开发人员还需要为不同 的数据源学习不同的数据查询语言,比如,查询 SQL 数据库的 T-SQL、查询 XML 数据的 DOM 结构等。
为了解决上面的问题,微软在.NET 3.5 版中推出一项具有突破性的新特性——语言集 成查询(LINQ)。LINQ 是 Language Integrate Query 的缩写,它在对象和数据之间建立一 种对应关系,可以使用访问内存对象的方式查询数据集合。LINQ 使查询成为 C#中的一种 语言构造。开发人员可以在 C#代码中嵌套类似于 SQL 语句的查询表达式,从而实现数据 查询的功能。
LINQ 查询的目的是从指定的数据源中查询满足符合特定条件的数据元素,并且通过 根据需要对这些查询的元素进行排序、连接等操作。所以 LINQ 查询包括如下几个主要 元素。
数据源:数据源表示 LINQ 查询将从哪里查找数据,它通常是一个或多个数据集, 每 个 数 据 集 包 含 一 系 列 的 元 素 。 数 据 集 是 一 个 类 型 为 IEnumerable<T> 或
4.2 LINQ 查询表达式
查询表达式是查询语言最基本的编写格式。同样,LINQ 查询表达式是一种直观、简 洁的查询代码编写方式。本节从多个角度详细介绍 LINQ 查询表达式的格式和具体应用, 包括选择、条件过滤、排序、联接等。
4.2.1 查询表达式
在进行 LINQ 查询的编写之前,首先需要了解查询表达式。查询表达式是 LINQ 查询 的基础,也是最常用的编写 LINQ 查询的方法。查询表达式由查询关键字和对应的操作数 组成的表达式整体。其中,查询关键字是常用的查询运算符。C#为这些运算符提供对应的 关键字,从而更好地与 LINQ 集成。
using System.Linq; using System.Xml.Linq; using System.Data.Linq;
注意:在 Visual Studio 2008 中,通过向导创建项目时,会自动引用 System.Linq 命名空
间,但是其他两个则根据需要手动添加。
·37·
精通 C# 3.0 与.NET 3.5 高级编程——LINQ、WCF、WPF、WF
在 C#中嵌入 LINQ 查询代码非常简单,只需要将 LINQ 查询看成普通的对象代码即可, 如示例代码 4-1 所示。其中,query1 就是一个典型的 LINQ 查询,foreach 语句则是遍历查 询到的结果。从代码中可以看出,可以像使用普通的对象一样使用 LINQ 查询,它并没有 什么特殊之处。
在 4.1.3 节讲到,数据源是 LINQ 查询中必不可少的元素。数据源是实现泛型接口 IEnumerable<T>或 IQueryable<T>的类对象。可以将 IEnumerable<T>简单理解成一个包含 多个元素的列表(或数据库中的表),可以用 foreach 遍历它的所有元素,从而轻松完成查 询操作。由于是泛型接口,所以通过为数据源指定不同的元素类型,可以表示任何数据集 合。在.NET 类库中,列表类、集合类、数组等都实现了接口 IEnumerable<T>,所以可以 直接将这些数据对象作为数据源在 LINQ 查询中使用。
4.1.3 LINQ 查询
LINQ 最具突破性的优势在于将文本查询与对象操作完美集成,它让查询数据和操作 对象一样安全和轻松。查询(Query)是 LINQ 的核心概念之一。
传统意义上的数据查询语言,通常是比较易懂,且有一定语义的文本。例如,在 SQL 查询语法中,用如下所示的 SQL 语句从数据库表 students 中查询所有学生的姓名。传统的 查询语言,通常由查询关键字来定义特定的功能,指定数据源、查询结果、筛选条件等。 例如,下面代码中的 select 和 from 是关键字,分别用来指定要查询的结果和数据源。
根据数据源类型,可以将 LINQ 技术分成如下所述的 4 个主要的技术方向。 LINQ to Object:数据源为实现了接口 IEnumerable<T>或 IQueryable<T>的内存数
据集合,这也是 LINQ 的基础,本章将详细介绍这方面的内容。 LINQ to :数据源为 数据集,这里将数据库中的表结构映射
到类结构,并通过 从数据库中获取到数据集到内存中,通过 LINQ 进行 数据查询。本书第 8 章将详细介绍这一技术。 LINQ to XML:数据源为 XML 文档,这里通过 XElement、XAttribute 等类将 XML 文档数据加载到内存中,通过 LINQ 进行数据查询。本书第 9 章将详细介绍这一 技术。 除了这 3 种常见的数据类型之外,.NET 3.5 还为用户扩展 LINQ 提供了支持,用户可 以根据需要实现第三方的 LINQ 支持程序,然后通过 LINQ 获取自定义的数据源。
IEnumerable<T>接口:它表示可以查询的数据集合,一个查询通常是逐个对集合 中的元素进行筛选操作,返回一个新的 IEnumerable<T>对象,用来保存查询结果。
IQueryable<T>接口:它继承 IEnumerable<T>接口,表示一个可以查询的表达式目 录树。
Enumerable 类:它通过对 IEnumerbale<T>提供扩展方法,实现 LINQ 标准查询运 算符。包括过滤、导航、排序、查询、联接、求和、求最大值、求最小值等操作。
4.1 LINQ 基础概念
LINQ 是微软在.NET Framework 3.5 版中推出的主要新特性之一。它为开发人员提供统 一的数据查询模式,并与.NET 开发语言(如:C#和 )集成,很大程度上简化了数 据查询的编码和调试等,提高数据处理的性能。
4.1.1 什么是 LINQ
如今,软件应用环境越来越多样化,软件需要处理的数据量也日渐庞大,数据之间的 关系日渐复杂。从而带动了存储技术的不断发展,越来越多的数据存储格式被应用到各种 软件场合。
在 C# 3.0 中可以直接使用的查询关键字和功能如表 4.1 所示。通过使用这些查询关键 字,可以编写出功能强大的数据查询程序。
关键字 from select where
orderby
group join
表 4.1 查询表达式关键字 功能
指定要查找的数据源以及范围变量,多个 from 子句则表示从多个数据源中查找数据 指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型 指定元素的筛选条件,多个 where 子句则表示了并列条件,必须全部都满足才能入选 指定元素的排序字段和排序方式。当有多个排序字段时,由字段顺序确定主次关系,可 指定升序和降序两种排序方式 指定元素的分组字段 指定多个数据源的关联方式
由于 LINQ 中查询表达式访问的是一个对象,所以该对象本身可以表示各种类型的数
第 4 章 LINQ 查询基础
据源。比如 SQL Server 数据库、XML 文档、 数据集,以及内存中的数据集合等。 从而,为不同类型数据源的数据查询提供一种统一的编码方式。在.NET 类库中,LINQ 相 关类库都在 System.Linq 命名空间下。该命名空间提供支持使用 LINQ 进行查询的类和接口, 其中最主要的是两个类和两个接口。
System.Console.Write("{0} ", item); } }
//定义数组 //定义查询语句 //打印输出
最后,就是编译、生成应用程序。
注意:LINQ 是在.NET 3.5 版之后新增的,所以在.NET 2.0 及早期版本程序中直接使用
LINQ 是不能实现的。要在.NET 2.0 及早期版本程序中使用 LINQ,首先需要通过 Visual Studio 2008 将程序自动转化到.NET 3.5 版本。
第 4 章 LINQ 查询基础
随着软件应用领域的不断扩大,软件需要处理的数据类型和数据量与日俱增。数据访 问的通用性、安全性、方便性逐渐引起开发人员和客户的重视。因此,微软公司在.NET3.5 中增加集成语言查询,它为开发人员提供一种统一的数据查询模式,可极大地提高数据访 问的安全性和高效性。通过简洁易用的接口,大大提供了软件开发效率。
·39·
精通 C# PF、WF
本节后面的小节中将进一步对各关键字进行介绍,包括它们的格式、使用方法、技巧 等。查询关键字的实际是在数据源对象及其元素上进行方法调用,将在 4.3 节详细介绍查 询方法的相关知识。
4.2.2 用 from 子句指定数据源
示例代码 4-1 static void Main(string[] args) {