当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > LINQ学习笔记:过滤Filtering

ASP.NET
Asp.Net 通用数据操作类 (附通用数据基类)
asp.net汉字转拼音和获取汉字首字母的代码
asp.net 多字段模糊查询代码
OpenCms 带分页的新闻列表
URLRewriter最简单入门介绍 URLRewriter相关资源
asp.net Repeater取得CheckBox选中的某行某个值
asp.net清空Cookie的两种方法
asp.net一些很酷很实用的.Net技巧
asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
asp.net TripleDES加密、解密算法
Asp.net中防止用户多次登录的方法
asp.net Repeater取得CheckBox选中的某行某个值的c#写法
asp.net DataGridView导出到Excel的三个方法[亲测]
C#,winform,ShowDialog,子窗体向父窗体传值
asp.net学习中发现的比较完整的流程
ASP.net 页面被关闭后,服务器端是否仍然执行中?
asp.net Context.Handler 页面间传值方法
asp.net xml序列化与反序列化
asp.net实例代码protected override void Render(HtmlTextWriter writer)
asp.net(c#)捕捉搜索引擎蜘蛛和机器人

ASP.NET 中的 LINQ学习笔记:过滤Filtering


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 106 ::
收藏到网摘: n/a

过滤Filtering

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

参数列表:

源序列: IEnumerable

断言: TSource => bool or (TSource, int) => bool(LINQ to SQL不支持)

实例:

 1: string[] names = { “James”,“Jack”,“Hendry”,“Mary”,“David” };
 2:  
 3: IEnumerable<string> query =
 4:  
 5: names.Where (name => name.EndsWith (“y”));
 6:  
 7: 
 8:  
 9: foreach(var s in query)
 10:  
 11: Console.WriteLine(s);
 12:  
 13: // Result: hendry, Mary

 

使用复合查询语法:

 1: IEnumerable<string> query = from n in names
 2:  
 3: where n.EndsWith (“y”)
 4:  
 5: select n;

 

在一个查询中, Where可以出现多次, 使用let可以将他们分离开:

 1: IEnumerable<string> query = from n in names
 2:  
 3: where n.Length > 3
 4:  
 5: let u = n.ToUpper( )
 6:  
 7: where u.EndsWith (“Y”)
 8:  
 9: select u; // Result: { “HENDRY”, “MARY” }

 

索引过滤

Where的另外一个断言一个int类型作为其第二个参数, 这个参数代表当前元素在输入序列中的索引位置, 断言可以使用这个信息来做过滤决定.例如:

 1: IEnumerable<string> query =
 2:  
 3: names.Where ((n, i) => i % 2 == 0);
 4:  
 5: foreach(var s in query)
 6:  
 7: Console.WriteLine(s);
 8:  
 9: // Result: James, Hendry, David

 

这里只过滤偶数位置的元素,LINQ to SQL不支持此种过滤.

LINQ to SQL当中的Where

以下的方法会被转换为SQL当中的like操作符:

Contains, StartsWith, EndsWith

例如, c.Name.Contains(“abc”)被翻译成customer.Name LIKE ‘%abc%’(如果要更加精确,可以使用参数化版本). 也可以使用SqlMethods.Like来执行更复杂的比较.你可以使用String上的CompareTo方法来执行字符顺序比较, 此方法映射到SQL的<和>操作符:

 1: dataContext.Purchase.Where(p=>p.Description.CompareTo(“c”) < 0);

 

LINQ to SQL也允许你应用Contains操作符对本地集合进行过滤操作, 例如:

 1: string[] chosenOnes = { “Tom”, “Jay” };
 2:  
 3: from c in dataContext.Customers
 4:  
 5: where chosenOnes.Contains (c.Name)

 

其映射到SQL的in操作符:

WHERE customer.Name IN (“Tom”, “Jay”)

Take和Skip

参数列表:

源序列: IEnumerable

被take或者skip的元素数量: int

Take使用前n个元素并丢弃剩余的元素, skip丢弃前n个元素并接受剩余的部分. 当你开发一个web页的时候这两个元素是很有用的, 它允许用户查看一个包含大量匹配数据的集合.例如, 假设用户使用短语”LINQ”查询一个图书数据库并且得到100个匹配记录, 下例返回了前20条:

 1: IQueryable query = dataContext.Books
 2:  
 3: .Where (b => b.Title.Contains (“LINQ”))
 4:  
 5: .OrderBy (b => b.Title)
 6:  
 7: .Take (20);

 

解析来的这个查询返回了第21到40条:

 1: IQueryable query = dataContext.Books
 2:  
 3: .Where (b => b.Title.Contains (“LINQ”))
 4:  
 5: .OrderBy (b => b.Title)
 6:  
 7: .Skip (20).Take (20);

 

在SQL SERVER 2005当中,LINQ to SQL将Take和Skip翻译成ROW_NUMBER函数, 而在SQL SERVER2000中则对应到top n子查询.

TakeWhile和SkipWhile

参数列表:

源序列: IEnumberable

断言: TSource=>bool 或者(TSource, int) => bool

TakeWhile枚举输入序列, emit每一个元素知道给定的断言等于true, 然后丢弃所有剩余的元素:

 1: int[] numbers = { 3, 5, 2, 234, 4, 1 };
 2:  
 3: var takeWhileSmall = numbers.TakeWhile (n => n < 100);
 4:  
 5: // RESULT: { 3, 5, 2 }

 

SkipWhile枚举输入序列,忽略每一个元素知道给定的断言等于true,然后返回所有剩余的元素

 1: int[] numbers = { 3, 5, 2, 234, 4, 1 };
 2:  
 3: var skipWhileSmall = numbers.SkipWhile (n => n < 100);
 4:  
 5: // RESULT: { 234, 4, 1 }

 

TakeWhile和SkipWhile没有SQL的对应翻译,因此如果你就其应用于LINQ to SQL当中将会得到一个运行时错误.

Distinct

Distinct返回从输入序列中剥离了重复元素的序列.如下例:

 1: char[] distinctLetters =
 2:  
 3: “HelloWorld”.Distinct().ToArray( );
 4:  
 5: string s = new string (distinctLetters); // HeloWrd

 

我们可以直接对string调用LINQ方法因为string实现了IEnumerable

待续!