LINQ分页skip和Take 用法
- 格式:xls
- 大小:10.50 KB
- 文档页数:9
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⼦句的结果。
Linq语法详细(三种⽅式:linq、Lambda、SQL语法)三种⽅式:linq、Lambda、SQL语法1.简单的linq语法//1var ss = from r in db.Am_recProSchemeselect r;//2var ss1 = db.Am_recProScheme;//3string sssql = "select * from Am_recProScheme";2.带where的查询//1var ss = from r in db.Am_recProSchemewhere r.rpId > 10select r;//2var ss1 = db.Am_recProScheme.Where(p => p.rpId > 10);//3string sssql = "select * from Am_recProScheme where rpid>10";3.简单的函数计算(count,min,max,sum)//1////获取最⼤的rpId//var ss = (from r in db.Am_recProScheme// select r).Max(p => p.rpId);////获取最⼩的rpId//var ss = (from r in db.Am_recProScheme// select r).Min(p => p.rpId);//获取结果集的总数//var ss = (from r in db.Am_recProScheme// select r).Count();//获取rpId的和var ss = (from r in db.Am_recProSchemeselect r).Sum(p => p.rpId);//2//var ss1 = db.Am_recProScheme.Max(p=>p.rpId);//var ss1 = db.Am_recProScheme.Min(p => p.rpId);//var ss1 = db.Am_recProScheme.Count() ;var ss1 = db.Am_recProScheme.Sum(p => p.rpId);Response.Write(ss);//3string sssql = "select max(rpId) from Am_recProScheme";sssql = "select min(rpId) from Am_recProScheme";sssql = "select count(1) from Am_recProScheme";sssql = "select sum(rpId) from Am_recProScheme";4.排序order by desc/ascvar ss = from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descending //倒序// orderby r.rpId ascending //正序select r;//正序var ss1 = db.Am_recProScheme.OrderBy(p => p.rpId).Where(p => p.rpId > 10).ToList();//倒序var ss2 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).ToList();string sssql = "select * from Am_recProScheme where rpid>10 order by rpId [desc|asc]";5.top(1)//如果取最后⼀个可以按倒叙排列再取值var ss = (from r in db.Am_recProSchemeselect r).FirstOrDefault();//()linq to ef 好像不⽀持 Last()var ss1 = db.Am_recProScheme.FirstOrDefault();//var ss1 = db.Am_recProScheme.First();string sssql = "select top(1) * from Am_recProScheme";6.跳过前⾯多少条数据取余下的数据//1var ss = (from r in db.Am_recProSchemeorderby r.rpId descendingselect r).Skip(10); //跳过前10条数据,取10条之后的所有数据//2var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Skip(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10";7.分页数据查询//1var ss = (from r in db.Am_recProSchemewhere r.rpId > 10orderby r.rpId descendingselect r).Skip(10).Take(10); //取第11条到第20条数据//2 Take(10): 数据从开始获取,获取指定数量(10)的连续数据var ss1 = db.Am_recProScheme.OrderByDescending(p => p.rpId).Where(p => p.rpId > 10).Skip(10).Take(10).ToList();//3string sssql = "select * from (select ROW_NUMBER()over(order by rpId desc) as rowNum, * from [Am_recProScheme]) as t where rowNum>10 and rowNum<=20";8.包含,类似like '%%'//1var ss = from r in db.Am_recProSchemewhere r.SortsText.Contains("张")select r;//2var ss1 = db.Am_recProScheme.Where(p => p.SortsText.Contains("张")).ToList();//3string sssql = "select * from Am_recProScheme where SortsText like '%张%'";9.分组group by//1var ss = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect new{n.Key, //这个Key是recTyperpId = n.Sum(r => r.rpId), //组内rpId之和MaxRpId = n.Max(r => r.rpId),//组内最⼤rpIdMinRpId = n.Min(r => r.rpId), //组内最⼩rpId};foreach (var t in ss){Response.Write(t.Key + "--" + t.rpId + "--" + t.MaxRpId + "--" + t.MinRpId);}//2var ss1 = from r in db.Am_recProSchemeorderby r.rpId descendinggroup r by r.recType into nselect n;foreach (var t in ss1){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//3var ss2 = db.Am_recProScheme.GroupBy(p => p.recType);foreach (var t in ss2){Response.Write(t.Key + "--" + t.Min(p => p.rpId));}//4string sssql = "select recType,min(rpId),max(rpId),sum(rpId) from Am_recProScheme group by recType";10.连接查询//1var ss = from r in db.Am_recProSchemejoin w in db.Am_Test_Result on r.rpId equals w.rsIdorderby r.rpId descendingselect r;//2var ss1 = db.Am_recProScheme.Join(db.Am_Test_Result, p => p.rpId, r => r.rsId, (p, r) => p).OrderByDescending(p => p.rpId).ToList(); //3string sssql = "select r.* from [Am_recProScheme] as r inner join [dbo].[Am_Test_Result] as t on r.[rpId] = t.[rsId] order by r.[rpId] desc";11.sql中的In//1var ss = from p in db.Am_recProSchemewhere (new int?[] { 24, 25,26 }).Contains(p.rpId)select p;foreach (var p in ss){Response.Write(p.Sorts);}//2string st = "select * from Am_recProScheme where rpId in(24,25,26)";。
查询内存对象这一章中主要介绍了使用LINQ查询内存对象的一些基本语法。
在下一章将会有更高级的用法介绍。
本章中的示例数据是一个简单的出版社信息。
下面的图表示了数据模型:在进入本章以前,有必要了解LINQ能够查询哪些内存对象。
能够使用LINQ查询的内存对象不是所有的内存对象都可以使用LINQ来查询。
正如前面说道的,能够使用LINQ查询的内存对象必须实现了IEnumerable<T>接口。
我们称实现了IEnumerable<T>接口的内存对象为序列。
因为在使用LINQ处理的时候就像是一个工厂按步骤处理原材料一样。
所幸的是所有的.NET 泛型集合都实现了IEnumerable<T>接口。
也就是说我们可以对所有的.NET泛型对象集合使用LINQ查询。
下面是关于所有这些泛型集合的简单示例。
Arrays我们可以对任何类型的数据使用LINQ查询。
包括多种类型的对象组成的集合。
如:下面是执行结果:此外,还可以为自定义的对象集合使用LINQ操作。
如下,就是对示例中的Book类使用LINQ操作。
返回的结果为” LINQ in Action”。
由此可见,对于普通的数据,我们可以很方便的使用LINQ来遍历其中的元素。
这对于我们在程序中处理数据是很方便的。
泛型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>在这里,我们仅对List<T>举一个简单的例子。
c#中LINQ的基本⽤法实例⼀、什么是LINQLINQ(读⾳link)代表语⾔集成查询(Language Integrated Query),是.NEt框架的扩展,它允许我们⽤SQL查询数据库的⽅式来查询数据的集合,使⽤它,你可以从数据库、程序对象的集合以及XML⽂档中查询数据下⾯⼀个简单的⽰例,可以查询数组中⼩于8的数字并输出。
⼀般步骤:获取数据源、创建查询、执⾏查询。
需要注意的是,尽管查询在语句中定义,但直到最后的foreach语句请求其结果的时候才会执⾏using System;using System.Collections.Generic;using System.Linq;namespace LINK查询{class Program{static void Main(string[] args){int[] number = { 2, 4, 6, 8, 10 }; //获取数据源IEnumerable<int> lowNum = from n in number //创建并存储查询,不会执⾏操作where n < 8select n;foreach(var val in lowNum) //执⾏查询{Console.Write("{0} ", val);}Console.ReadKey();}}}⼆、查询表达式的结构查询表达式由查询体后的from⼦句组成,其⼦句必须按⼀定的顺序出现,并且from⼦句和select⼦句这两部分是必须的。
先介绍⼀下⼦句2.1 from⼦句from⼦句指定了要作为数据源使⽤的数据集合,它的语法是:from Type Item in Items其中Type是集合中元素的类型,是可选的,因为编译器可以从集合来推断类型。
Item是迭代变量的名字。
Items是要查询的集合的名字,必须是可枚举类型的它和foreach⽐较相似,但foreach语句在遇到代码时就执⾏其主体,⼆from⼦句什么也不执⾏。
在过去的几个月中我写了一系列涵盖了VS和.NET Framework Orcas版中的一些新特性的帖子,下面是这些帖子的链接:自动属性,对象初始化器,和集合初始化器扩展方法Lambda表达式查询句法匿名类型以上的语言特性帮助数据查询成为一等编程概念。
我们称这个总的查询编程模型为“LINQ”--它指的是.NET语言级集成查询。
开发者可以在任何的数据源上使用LINQ。
他们可以在他们选择的编程语言中表达高效的查询行为,选择将查询结果转换或构形成他们想要的任何格式,然后非常方便地操作这个结果集。
有LINQ功能的语言可以提供完全的类型安全和查询表达式的编译时检查,而开发工具则可以提供在编写LINQ代码时完全的智能感知,调试,和丰富的重构支持。
LINQ支持一个非常丰富的的扩展性模型,该模型将有助于对不同的数据源生成不同的高效运算因子(domain-specific operators)。
.NET Framework的Orcas版本将发布一些内置库,这些库提供了针对对象(Objects),XML,和数据库的LINQ支持。
什么是LINQ to SQL?LINQ to SQL 是随.NET Framework Orcas版一起发布的O/RM(对象关系映射)实现,它允许你用.NET 的类来对一个关系型数据库建模。
然后你可以用LINQ对数据库进行查询,以及进行更新/插入/删除数据的操作。
LINQ to SQL完全支持事务,视图和存储过程。
它还提供了一种把数据验证和业务逻辑规则结合进你的数据模型的便利方式。
使用LINQ to SQL对数据库建模:Visual Studio Orcas版中提供了一个LINQ to SQL设计器,该设计器提供了一种简易的方式,将数据库可视化地转换为LINQ to SQL对象模型。
我下一篇博客将会更深入一些来介绍怎么使用该设计器(你可以观看我一月份时录制的这个关于如何从头开始创建LINQ to SQL 模型的录像)。
C#基础知识系列-7Linq详解前言在上一篇中简单介绍了Linq的入门级用法,这一篇尝试讲解一些更加深入的使用方法,与前一篇的结构不一样的地方是,这一篇我会先介绍Linq里的支持方法,然后以实际需求为引导,分别以方法链的形式和类SQL的形式写出来。
前置概念介绍1.Predicate<T> 谓词、断言,等价于Func<T,bool> 即返回bool的表达式2.Expression<TDelegate> 表达式树,这个类很关键,但是在这里会细说,我们会讲它的一个特殊的泛型类型:Expression<Func<T,bool>> 这个在某些数据源的查询中十分重要,它代表lambda表达式中一种特殊的表达式,即没有大括号和return 关键字的那种。
我们先准备两个类:1.Student/学生类:/// <summary>/// 学生/// </summary>public class Student{/// <summary>/// 学号/// </summary>public int StudentId { get; set; }/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 班级/// </summary>public string Class { get; set; }/// <summary>/// 年龄/// </summary>public int Age { get; set; }}2.Subject/科目类:3./// <summary>4./// 科目5./// </summary>6.public class Subject7.{8./// <summary>9./// 名称10./// </summary>11.public string Name { get; set; }12./// <summary>13./// 年级14./// </summary>15.public string Grade { get; set; }16./// <summary>17./// 学号18./// </summary>19.public int StudentId { get; set; }20./// <summary>21./// 成绩22./// </summary>23.public int Score { get; set; }24.}Subject 和Student通过学号字段一一关联,实际工作中数据表有可能会设计成这。
linq 高级用法今天咱们来聊聊Linq的高级用法。
Linq就像是一个超级小助手,能让我们处理数据变得特别简单又有趣。
比如说,我们有一堆数字,像1、3、5、7、9。
要是我们想知道这里面哪些数字比5大,要是没有Linq,我们可能得一个一个去看,然后挑出来。
但是有了Linq呀,就好像有了魔法一样。
就像我们在一个装满各种颜色小珠子的盒子里找红色的珠子,Linq可以一下子就把符合我们要求的东西找出来。
在那些数字里,Linq可以快速地告诉我们7和9比5大。
这就好像是我们让Linq这个小助手去数字的小世界里帮我们找东西一样。
再讲讲Linq的排序用法吧。
想象我们有好多小卡片,上面写着不同的分数,有80分、90分、70分、60分。
我们想把这些分数按照从高到低的顺序排好。
Linq就像一个很聪明的小伙伴,它可以很快地把这些分数重新排列好,变成90分、80分、70分、60分。
这就好比是我们让Linq把那些小卡片按照分数的高低重新摆放整齐。
还有呢,Linq可以把很多东西组合起来。
就好比我们有一些水果贴纸,有苹果贴纸、香蕉贴纸、橘子贴纸,还有一些小动物贴纸,有小猫贴纸、小狗贴纸、小兔子贴纸。
我们想把水果贴纸和小动物贴纸按照一定的规则放在一起。
Linq就能轻松做到。
比如说,先放一个苹果贴纸,再放一个小猫贴纸,接着放一个香蕉贴纸,再放一个小狗贴纸,就像串珠子一样把它们串起来。
有一次呀,我的小伙伴在整理他的玩具。
他有好多不同类型的玩具,有小汽车、小飞机、小娃娃、小积木。
他想知道哪些玩具是可以动的,哪些是不能动的。
他就用类似Linq的想法,在心里把小汽车和小飞机归为可以动的,把小娃娃和小积木归为不能动的。
这就跟Linq处理数据的感觉很像,只不过Linq是在电脑里处理那些数字或者其他信息。
Linq的高级用法还能让我们在处理很多很多数据的时候不觉得头疼。
就像我们要在一大箱的彩色铅笔里找特定颜色的铅笔,不管这箱铅笔有多少,Linq都能快速地完成任务。
c#中LINQ的基本⽤法(⼀)LINQ(Language Integrated Query,语⾔集成查询),在C#语⾔中集成了查询语法,可以⽤相同的语法访问不同的数据源。
LINQ提供了不同数据源的抽象层,所以可以使⽤相同的语法。
这⾥主要介绍LINQ的核⼼原理和C#中⽀持C# LINQ查询的语⾔扩展。
1.语法使⽤LINQ查询出来⾃巴西的所以世界冠军。
这⾥可以使⽤List<T>类的FindAll()⽅法,但使⽤LINQ查询语法更简单 static void LINQQuery(){//var query = from r in Formula1.GetChampions()where r.Country == "Brazil"orderby r.Wins descendingselect r;foreach (var r in query){Console.WriteLine("{0:A}", r);}}变量query只指定了LINQ查询。
该查询不是通过这个赋值语句执⾏的,⽽是使⽤foreach循环访问查询时执⾏的。
2.扩展⽅法 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,Func<TSource,bool> predicate){foreach(TSource item in source){if(predicate(item)){yield return item;}}}因为Where()作为⼀个泛型⽅法,所以它可以⽤于包含在集合中的任意类型。
实现了IEnumerable<T>接⼝的任意集合都⽀持它。
3.推迟查询的执⾏前⾯提到,在运⾏期间定义LINQ查询表达式时,查询不会运⾏。
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),才会执⾏。