第二章[Linq介绍和查询表达式]
- 格式:ppt
- 大小:1.11 MB
- 文档页数:14
LINQ教程之LINQ操作语法LINQ查询时有两种语法可供选择:查询表达式语法(Query Expression)和⽅法语法(Fluent Syntax)。
⼀、查询表达式语法查询表达式语法是⼀种更接近SQL语法的查询⽅式。
LINQ查询表达式语法如下:from<range variable> in <IEnumerable<T> or IQueryable<T> Collection><Standard Query Operators> <lambda expression><select or groupBy operator> <result formation>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⼦句的结果。
C#使⽤LINQ查询教程21.1 LINQ查询概述LINQ可以对多种数据源和对象进⾏查询,如数据库、数据集、XML⽂档甚⾄是数组,这在传统的查询语句中是很难实现的。
如果有⼀个集合类型的值需要进⾏查询,则必须使⽤Where等⽅法进⾏遍历,⽽使⽤LINQ可以仿真SQL语句的形式进⾏查询,极⼤的降低了难度。
21.1.1 准备数据源既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使⽤LINQ进⾏数据查询时⾸先需要准备数据源。
1.数组数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。
数组数据源⽰例代码如下所⽰。
string[] str = { "学习", "学习LINQ", "好好学习", "⽣活很美好" };int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };数组可以看成是⼀个集合,虽然数组没有集合的⼀些特性,但是从另⼀个⾓度上来说可以看成是⼀个集合。
在传统的开发过程中,如果要筛选其中包含“学习”字段的某个字符串,则需要遍历整个数组。
2.SQL Server在数据库操作中,同样可以使⽤LINQ进⾏数据库查询。
LINQ以其优雅的语法和⾯向对象的思想能够⽅便的进⾏数据库操作,为了使⽤LINQ进⾏SQL Server数据库查询,可以创建两个表,这两个表的结构如下所⽰。
Student(学⽣表):S_ID:学⽣ID。
S_NAME:学⽣姓名。
S_CLASS:学⽣班级。
C_ID:所在班级的ID。
上述结构描述了⼀个学⽣表,可以使⽤SQL语句创建学⽣表,⽰例代码如下所⽰。
USE [student]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[Student]([S_ID] [int] IDENTITY(1,1) NOT NULL,[S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,[S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,[C_ID] [int] NULL,CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED([S_ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]为了更加详细的描述⼀个学⽣所有的基本信息,就需要创建另⼀个表对该学⽣所在的班级进⾏描述,班级表结构如下所⽰。
语言集成查询(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 语句中循环访问查询变量时发生。
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查询语法介绍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使用查询句法会觉得很复杂(比如连接查询)。
C#10.LINQ的三种查询语句写法LINQ(语言集成查询)是C#编程语言中的一部分。
它在.NET Framework 3.5 和 C#3.0 被引入,在 System.Linq 命名空间中使用。
LINQ 为我们提供了通用的查询语法,该语法使我们能够查询来自各种数据源的数据。
这意味着我们可以从各种数据源(如 SQL Server 数据库,XML 文档, 数据集)以及任何其他内存中对象(如Collections,Generics 等)查询获取或更新设置数据。
编写 LINQ 查询,我们需要三个步骤:1、定义或引入数据源(内存中的对象,SQL,XML)2、编写询问语句3、在数据源中执行查询语句下面让我们来演示不同的 LINQ 查询语句写法简单的查询表达式:分别有:数据初始化、条件表达式、对象选取表达式组成from object in DataSourcewhere [condition]select object;设置查询条件:对象大于 5var QuerySyntax = from obj in integerList where obj > 5select obj;设置查询条件:对象大于 5using System;using System.Collections.Generic;using System.Linq;namespace Csharp{class Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法1:查询表达式var QuerySyntax = from obj in integerList where obj > 5select obj;Console.WriteLine("LINQ 方法1:查询表达式");// 执行LINQ查询foreach (var item in QuerySyntax){Console.Write(item + " ");}Console.ReadKey();}}}输出大于 5 的对象:6 7 8 9 10DataSource.ConditionMethod([Condition]).SelectMethod();扩展数据源对象Where 查询方法var MethodSyntax = integerList.Where(obj => obj > 5).T oLi st();namespace Csharp{class Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法2:对象表达式var MethodSyntax = integerList.Where(obj => obj > 5).T oLi st();Console.WriteLine("LINQ 方法2:对象表达式");// 执行LINQ查询foreach (var item in MethodSyntax){Console.Write(item + " ");}Console.ReadKey();}}输出大于 5 的对象:6 7 8 9 10两种查询语法也可以混合使用先使用查询语句表达式语法将数据筛选,然后通过对象方法表达式,返回数据之和var MethodSyntax = (from obj in integerListwhere obj > 5select obj).Sum();namespace Csharpclass Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法3:2种语法混合使用var HybridMethod = (from obj in integerList where obj > 5select obj).Sum();Console.WriteLine("LINQ 方法3:2种语法混合使用"); // 执行LINQ查询Console.Write($"数据之和为:{HybridMethod}"); Console.ReadKey();}}}先筛选大于 5 的对象:6 7 8 9 10,再对这些对象求和输出:40今天我们给大家分享了,C#语言中LINQ查询的3种语法,大家都学会了吗?。
c#之linq——⼩⽩⼊门级通过本⽂需要掌握的关于linq的知识点为:linq的基本概念及其特点linq中常见操作及使⽤linq常见的⽅法查询1 Linq基本概念1.1 ling定义Linq(Language Integrated Query),语⾔集成查询,是⼀种使⽤类似SQL语句操作多种数据源的功能。
如,我们可以使⽤c#查询access数据库、.net数据集、xml⽂档以及实现了IEnumerable或IEnumerable<T>接⼝的集合类(如List,Array,SortedSet,Stack,Queue等,可以进⾏遍历的数据结构都会集成该类)。
从.net framework3.5中开始引⼊,能够提升程序数据处理能⼒和开发效率,具有集成性、统⼀性、可扩展性、抽象性、说明式编程、可组成型、可转换性等优势。
1.2 linq提供的程序Linq to Object。
提供程序查询内存中的集合和数组。
Linq to DataSet。
提供程序查询数据集中的数据。
Linq to SQL。
提供程序查询和修改Sql Server数据库中的数据,将应⽤程序中的对象模型映射到数据库表。
Linq to Entities。
使⽤linq to entities时,会在后台将linq语句转换为sql语句与数据库交互,并能提供数据变化追踪。
Linq to XML。
提供程序查询和修改XML,既能修改内存中的xml,也可以修改从⽂件中加载的。
2 Linq查询linq查询包括两种⽅式,⼀是语句查询,⼆是⽅法查询。
语句查询使⽤较多,也更容易理解,微软官⽹推荐使⽤。
下⾯介绍语句查询的⼦句使⽤。
2.1 from⼦句⽤来标识查询的数据源。
基本语法格式为:from 迭代变量 in 数据源⾸先,通过以下简单⽰例,给出from⽤法static void Main(string[] args){var nums = new int[] {56,97,98,57,74,86,31,90};var queryInfo = from num in nums select num;//num为数据中的每个元素(相当于foreach中迭代变量)var numStr = string.Empty;foreach (var item in queryInfo){numStr += item + " ";}Console.WriteLine($"数据元素包括:{numStr}");}运⾏结果如下图:注:查询表达式在循环访问查询变量时(如上述⽰例中foreach),才会执⾏。
LINQtoObjects系列(2)两种查询语法介绍 LINQ为我们提供了两种查询语法,分别是查询表达式和查询⽅法语法。
这篇⽂章分为以下⼏个⽅⾯进⾏总结。
1,⼀个包含两种查询语法的简单⽰例2,查询表达式的结构3,查询⽅法相关的运算符⼀个LINQ查询既可以使⽤查询表达式实现,也可以⽤查询⽅法实现,还可以同时组合两种查询。
下⾯是⼀个简单的⽰例,代码如下。
namespace LINQDemo3{class Program{static void Main(string[] args){int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };//查询表达式var query = from number in numberswhere number < 20select number;//查询⽅法(⼀般⽤lambda表达式)var numsMethod = numbers.Where(p => p < 20);//两种⽅式组合var numsCount = (from number in numberswhere number < 20select number).Count();foreach (var item in query){Console.WriteLine("{0}",item);}foreach (var item in numsMethod){Console.WriteLine("{0}",item);}Console.WriteLine(numsCount);Console.ReadKey();}}}查询表达式通常以from开头,以select结束,这跟SQL语句的顺序不太⼀样,C#这么做的原因之⼀是让VS智能感应能在我们输⼊代码时给我们更多选项。
⼀个查询表达式通常的结构如下图。
image查询⽅法主要分为过滤,排序,分组,统计,转换等⼏类操作,⽤⼀张图总结如下。
来源: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查询表达式基础“查询”是指一组指令,这些指令描述要从一个或多个给定数据源检索的数据以及返回的数据应该使用的格式和组织形式。
查询不同于它所产生的结果。
通常,源数据会在逻辑上组织为相同种类的元素序列。
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 数据,然后生成最终的结果序列。