Linq过滤符号Where/Skip/TakeWhile/Distinct使用实例讲解
来源:互联网 发布:黎明杀机优化补丁 编辑:程序博客网 时间:2024/05/03 18:59
原文地址:http://www.cnblogs.com/Bany/archive/2012/05/10/2494440.html
过滤符号总览:
Where: 返回满足给定条件的子集,SQL对应语法也是Where
Take: 返回前N条记录,丢弃剩余部分,SQL对应语法为Where ROW_NUMBER()或者TOP n子查询
Skip:跳过前N条记录, 返回剩余部分, SQL对应语法为Where ROW_NUMBER()或者NOT IN(Select Top N…)
TakeWhile:返回输入序列中的所有元素直到断言等于true,无SQL对应语法
SkipWHile:跳过输入序列中的元素直到断言等于true, 返回剩下的所有元素, 无SQL对应语法
Distinct:返回无重复的集合元素,SQL对应语法为Select Distinct
使用这些过滤方法, 你总是会得到与原始输入序列相等或者更少元素的输出序列,而不可能得到更多的元素.得到的这些元素与原先的元素是一致, 中间并没有做任何的转换.
一、Where
string[] names = { “James”,“Jack”,“Hendry”,“Mary”,“David” };
IEnumerable<string> query = names.Where (name => name.EndsWith ("y"));
foreach(var s in query)
Console.WriteLine(s); // Result: hendry, Mary
使用复合查询语法:
IEnumerable<string> query = from n in names where n.EndsWith ("y") select n;
在一个查询中, Where可以出现多次, 使用let可以将他们分离开:
IEnumerable<string> query = from n in names
where n.Length > 3
let u = n.ToUpper()
where u.EndsWith ("Y")
select u; //Result: { "HENDRY", "MARY" }
Where的另外一个断言一个int类型作为其第二个参数, 这个参数代表当前元素在输入序列中的索引位置, 断言可以使用这个信息来做过滤决定.例如:
IEnumerable<string> query =
names.Where ((n, i) => i % 2 == 0);
foreach(var s in query)
Console.WriteLine(s); //Result: James, Hendry, David
这里只过滤偶数位置的元素,LINQ to SQL不支持此种过滤.
二、LINQ to SQL当中的Where
以下的方法会被转换为SQL当中的like操作符:
Contains, StartsWith, EndsWith
例如, c.Name.Contains(“abc”)被翻译成customer.Name LIKE ‘�c%’(如果要更加精确,可以使用参数化版本). 也可以使用SqlMethods.Like来执行更复杂的比较.你可以使用String上的CompareTo方法来执行字符顺序比较, 此方法映射到SQL的<和>操作符:
dataContext.Purchase.Where(p=>p.Description.CompareTo(“c”) < 0);
LINQ to SQL也允许你应用Contains操作符对本地集合进行过滤操作, 例如:
string[] chosenOnes = { "Tom", "Jay" };
from c in dataContext.Customers where chosenOnes.Contains (c.Name)
其映射到SQL的in操作符:
WHERE customer.Name IN (“Tom”, "Jay")
三、Take和Skip
被take或者skip的元素数量: int
Take使用前n个元素并丢弃剩余的元素,
skip丢弃前n个元素并接受剩余的部分.
当你开发一个web页的时候这两个元素是很有用的, 它允许用户查看一个包含大量匹配数据的集合.例如, 假设用户使用短语LINQ查询一个图书数据库并且得到100个匹配记录, 下例返回了前20条:
IQueryable query = dataContext.Books
.Where (b => b.Title.Contains ("LINQ"))
.OrderBy (b => b.Title)
.Take (20);
接下来的这个查询返回了第21到40条:
IQueryable query = dataContext.Books
.Where (b => b.Title.Contains ("LINQ"))
.OrderBy (b => b.Title)
.Skip (20).Take (20);
在SQL SERVER 2005当中,LINQ to SQL将Take和Skip翻译成ROW_NUMBER函数, 而在SQL SERVER2000中则对应到top n子查询.
四、TakeWhile和SkipWhile
TakeWhile从头开始检查序列中的每一个元素,碰到第一个符合条件的元素就停止.返回符合条件元素前面的所有元素.
int[] numbers = { 3, 5, 2, 234, 4, 1 };
// RESULT: { 3, 5, 2 }
SkipWhile同TakeWhile相反,从头开始检查序列中的每一个元素.碰到第一个符合条件的元素后,将此元素和其后所有元素返回.
int[] numbers = { 3, 5, 2, 234, 4, 1 };
var skipWhileSmall = numbers.SkipWhile (n => n < 100);
// RESULT: { 234, 4, 1 }
TakeWhile和SkipWhile没有SQL的对应翻译,因此如果你就其应用于LINQ to SQL当中将会得到一个运行时错误.
五、Distinct
Distinct返回从输入序列中剥离了重复元素的序列.如下例:
char[] distinctLetters =
"HelloWorld".Distinct().ToArray( );
string s = new string (distinctLetters); // HeloWrd
我们可以直接对string调用LINQ方法因为string实现了IEnumerable
- Linq过滤符号Where/Skip/TakeWhile/Distinct使用实例讲解
- linq distinct、union、concat、intersect、except、skip、take、skipwhile、takewhile、
- Linq中Take、TakeWhile、Skip、SkipWhile的比较
- Linq中Take、TakeWhile、Skip、SkipWhile的比较
- Linq中Take、TakeWhile、Skip、SkipWhile的比较
- Linq之Take Skip TakeWhile SkipWhile Reverse Union Concat 用法
- 步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefaul
- 步步为营VS 2008 + .NET 3.5(6) - LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhile、Single、SingleOrDefaul
- Linq中Skip和Take用法(TakeWhile和SkipWhile用法)
- Linq Distinct()使用
- 7.3 Filtering 过滤操作 - Debounce/Distinct/Filter/Sample/Skip/Take
- linq实例讲解
- DataTable中使用Order By排序与Where过滤 实例
- C# Linq Distinct的使用
- Linq中的TakeWhile和SkipWhile
- LINQ to SQL语句之Where/Select/Distinct
- LINQ:使用Take和Skip实现分页
- LINQ查询操作符之Distinct、Union、Concat、Intersect、Except、Skip、Take、SkipWhile、TakeWhi
- Java编码问题解决方案大揭密
- Apache Commons:Betwixt介绍
- STL容器
- Storyboard里面的几种Segue区别:push,modal,popover,replace和custom
- 判断二叉树是不是平衡
- Linq过滤符号Where/Skip/TakeWhile/Distinct使用实例讲解
- 在Eclipse下搭建Android开发环境教程
- 网站用户体验
- IIS中浏览.aspx页面“无法显示XML页”的解决办法
- hdu 1003 Max Sum
- android 引导界面的设计
- Qt 返回系统时间
- 图片置灰处理
- 如何将WCF服务发布到IIS中去VS2010版