青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Javen-Studio 咖啡小屋

http://javenstudio.org - C++ Java 分布式 搜索引擎
Naven's Research Laboratory - Thinking of Life, Imagination of Future

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  24 隨筆 :: 57 文章 :: 170 評論 :: 4 Trackbacks

4.4         查詢語法(Query Syntax

C# 中現(xiàn)有的 foreach 語句在 .NET Framework IEnumerable/IEnumerator 方法之上提供了一個聲明式的語法(declarative syntax)。Foreach 語句確實是可選的(is strictly optional),但是卻被證明(proven to)是一個非常方便(convenient)和流行的(popular)語言機制(language mechanism)。

 

建立在這種先例之上(Building on this precedent),查詢語法(query syntax)對大多數(shù)通用的查詢操作符(common query operators)來說使用一個聲明式的語法(declarative syntax)來簡單地查詢表達式(query expressions),如 Where, Select, SelectMany, GroupBy, OrderBy, ThenBy, OrderByDescending, ThenByDescending

 

讓我們先看看下面這段本文開始就提到的簡單的查詢:

 

IEnumerable<string> expr = names 
                           .Where(s 
=> s.Length == 5
                           .OrderBy(s 
=> s)
                           .Select(s 
=> s.ToUpper());

 

使用查詢語法我們可以重寫這段原樣的語句(this exact statement)如下所示:

 

IEnumerable<string> expr = from s in names 
                           where s.Length 
== 5
                           orderby s
                           select s.ToUpper();

 

就像 C# foreach 語句一樣,查詢語法表達式(query syntax expressions)閱讀起來更緊湊更容易(more compact and easier),但是卻是完全隨意的(completely optional)。能寫進查詢語法(query syntax)的每一個表達式都有一個相應的(corresponding)使用句點“.”符號(using dot notation)的(雖然是更冗長的(albeit more verbose))語法。

 

讓我們開始看看一個查詢表達式(query expression)的基本結構(basic structure)。C# 里每一個合成的查詢表達式(syntactic query expression)都是從一個 from 子句(from clause)開始,到一個 select group 子句結束。這個最初的(initialfrom 子句能夠跟隨在(followed by)空的或多個(zero or more from where 子句后面。每個 from 子句都是一個發(fā)生器(generator)來傳入(introduces)一個涉及(ranging over)一個序列(a sequence)的迭代變量(an iteration variable),而每一個 where 子句是一個過濾器(filter)來排斥(excludes)結果中條目(items from the result)。最后的 select group 子句都可以加上一個 orderby 子句的前綴(be preceded by)用來指定結果集的排序(specifies an ordering for the result)。這種簡單的語法(simplified grammar)對一個單個的查詢表達式(a single query expression)來說如下所示:

 

from itemName in srcExpr
((from itemName 
in srcExpr) | (where predExpr))*
(orderby (keyExpr (ascending
|descending)?)+)?
((select selExpr) 
| (group selExpr by keyExpr))

 

舉例來說,考察下面兩段查詢表達式:

 

var query1 = from p in people
             where p.Age 
> 20
             orderby p.Age descending, p.Name
             select 
new 
                 p.Name, Senior 
= p.Age > 30, p.CanCode
             }
;

var query2 
= from p in people
             where p.Age 
> 20
             orderby p.Age descending, p.Name
             group 
new 
                p.Name, Senior 
= p.Age > 30, p.CanCode
             }
 by p.CanCode;

 

編譯器對待(treats)這些查詢表達式就像如下它們用清楚的句點符號(the following explicit dot-notation)寫的程序一樣:

 

var query1 = people.Where(p => p.Age > 20)
                   .OrderByDescending(p 
=> p.Age)
                   .ThenBy(p 
=> p.Name)
                   .Select(p 
=> new 
                       p.Name, 
                       Senior 
= p.Age > 30
                       p.CanCode
                   }
);

var query2 
= people.Where(p => p.Age > 20)
                   .OrderByDescending(p 
=> p.Age)
                   .ThenBy(p 
=> p.Name)
                   .GroupBy(p 
=> p.CanCode, 
                            p 
=> new {
                                   p.Name, 
                                   Senior 
= p.Age > 30
                                   p.CanCode
                   }
);

 

查詢表達式(Query expressions)執(zhí)行了(perform)一個基于方法名(method names)的機器翻譯處理(mechanical translation)。被選擇的(that is chosen)精確的查詢操作符的實現(xiàn)(exact query operator implementation)既依靠(depends both on)被查詢的變量的類型又依靠活動范圍(in scope)里的擴展方法(extension methods)。

 

查詢表達式展示了多么遙遠的(shown so far)未來,僅僅使用了一個發(fā)生器(only used one generator)。當不止一個的發(fā)生器(generator)被使用的時候,每一個并發(fā)的發(fā)生器(each subsequent generator)在被它替代的事物的上下文(the context of its predecessor)中被賦值(evaluated)。舉例來說,考察這段對我們的查詢做了很下修改(slight modification)的程序:

 

var query = from s1 in names where s1.Length == 5
            from s2 
in names where s1 == s2
            select s1 
+ " " + s2;

 

當對下面的輸入的數(shù)組運行時:

 

string[] names = "Burke""Connor""Frank""Everett"
                   
"Albert""George""Harris""David" }
;

 

我們將得到下面的結果:

 

Burke Burke
Frank Frank
David David

 

上面這個查詢表達式用句點符號的表達式(dot notation expression)展開(expands)如下:

 

var query = names.Where(s1 => s1.Length == 5)
                 .SelectMany(s1 
=> 
                     names.Where(s2 
=> s1 == s2) 
                          .Select(s2 
=> s1 + " " + s2)
                 );

 

注意 SelectMany 的使用會導致(causes)在我們外部的結果(in the outer result)中的內部的查詢表達式(the inner query expression)變得呆板(to be flattened)。

 

我們對查詢表達式的簡單的語法(simplified grammar)從本節(jié)開始(from earlier in this section)就忽略了(omitted)一個很有用的特性(very useful feature)。在一個并發(fā)的查詢里(in a subsequent query)它是很有用的在將一個查詢的結果(results of one query)視為(treat as)一個發(fā)生器(a generator)的時候。為了支持這種特性,查詢表達式使用 into 關鍵詞來在一個 select group 子句之后結合(splice)一個新的查詢表達式。這里是這種簡單的語法來闡明(illustratesinto 關鍵詞是怎樣適應(fits in with)其余的語法的(the rest of the syntax)。

 

from itemName in srcExpr
((from itemName 
in srcExpr) | (where predExpr))*
(orderby (keyExpr (ascending
|descending)?)+)?
((select selExpr) 
| (group selExpr by keyExpr))
(
  into itemName
    ((from itemName 
in srcExpr) | (where predExpr))*
    (orderby (keyExpr (ascending
|descending)?)+)?
    ((select selExpr) 
| (group selExpr by keyExpr))
)
*

 

這個 into 關鍵詞對后期處理(post-processing)一個 group by 子句的結果來說是特別有用的(especially useful)。例如,考查下面的程序:

 

var query = from item in names
            orderby item
            group item by item.Length into lengthGroups
            orderby lengthGroups.Key descending
            select lengthGroups;

foreach (var group in query) 
    Console.WriteLine(
"Strings of length {0}", group.Key);

    
foreach (var val in group.Group)
        Console.WriteLine(
"  {0}", val);
}

 

這段程序輸出下面的結果:

 

Strings of length 7
  Everett
Strings of length 
6
  Albert
  Connor
  George
  Harris
Strings of length 
5
  Burke
  David
  Frank

 

本章節(jié)描述的是 C# 語言是怎么實現(xiàn)查詢表達式的,其他的語言可能選擇(elect)使用清楚的語法(explicit syntax)來支持附加的查詢操作符(additional query operators)。

 

需要重點注意的是(It is important to note that)查詢語法(query syntax)決不是(is by no means)硬要聯(lián)系上(hard-wired to)標準查詢操作符(the standard query operators),它是純凈的語法特性(purely syntactic feature)可以應用于(applies to)任何通過使用適當?shù)拿趾秃灻?/SPAN>the appropriate names and signatures)實現(xiàn)基本方法(underlying methods)來履行(fulfillsLINQ模式(LINQ pattern)的任何事物。上面描述的標準查詢操作符工作的方式是通過使用擴展方法(extension methods)來增加(augment IEnumerable<T> 接口。開發(fā)者可以使用(exploit)查詢語法(query syntax)在任何他們希望的類型上(any type they wish),只要(as long as)他們確信(make sure)它追隨(adheres toLINQ模式(LINQ pattern),而不是通過直接實現(xiàn)需要的方法(direct implementation of the necessary methods),或者通過像擴展方法一樣添加它們(adding them as extension methods)。

 

這個LINQ項目自己開發(fā)(exploited)的擴展特性(extensibility)是通過供應(the provision of)兩個LINQ式的APItwo LINQ-enabled API's)提供的。其中一個名叫 DLinq,它是為基于SQL的數(shù)據訪問(SQL-based data access)提供的LINQ模式的實現(xiàn),另一個叫作 XLinq,它允許 LINQ 查詢 XML 數(shù)據。它們兩個都在下面的章節(jié)里描述。

 

 

 

 

 

待續(xù), 錯誤難免,請批評指正,譯者Naven 2005-10-24

posted on 2005-10-25 20:27 Javen-Studio 閱讀(1170) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区免费看| 久久狠狠久久综合桃花| 999亚洲国产精| 久久天堂精品| 亚洲欧美日韩一区二区在线 | 欧美国产日本| 久久精品理论片| 在线看成人片| 欧美在线亚洲| 亚洲免费视频观看| 国产精品v亚洲精品v日韩精品 | 亚洲一区二区成人| 国产精品99久久久久久久女警 | 欧美成人一区二区| 午夜精品一区二区三区四区| 国产精品狼人久久影院观看方式| 一区二区福利| 一区二区三区视频在线看| 欧美三级网址| 午夜精品久久久| 亚洲欧美电影院| 国产日韩欧美成人| 久久激情综合网| 久久精品首页| 黄色成人av网| 欧美激情精品久久久久| 欧美高清在线一区| 亚洲一二三区在线| 亚洲欧美日韩一区在线| 国内伊人久久久久久网站视频 | 久久天天躁狠狠躁夜夜av| 在线观看视频欧美| 亚洲国产高清在线观看视频| 欧美aⅴ99久久黑人专区| 日韩午夜黄色| 亚洲一区尤物| 精品成人国产| 亚洲黄色毛片| 国产精品人成在线观看免费| 久久久久综合一区二区三区| 欧美成人午夜激情视频| 亚洲欧美电影院| 久久久久久久综合日本| 91久久久在线| 亚洲自拍偷拍视频| 91久久国产精品91久久性色| 在线视频精品| 欲色影视综合吧| 在线亚洲精品福利网址导航| 狠狠色2019综合网| 99香蕉国产精品偷在线观看| 国产视频在线观看一区二区三区| 亚洲国产精品成人一区二区| 夜夜爽www精品| 亚洲在线中文字幕| 久久精品亚洲精品| 日韩网站在线观看| 亚洲欧美日韩精品久久亚洲区| 国产综合视频| 妖精成人www高清在线观看| 国产在线日韩| 中文精品在线| 亚洲欧洲一区| 欧美一区二区三区免费视频| 日韩一级网站| 久久久91精品国产一区二区三区| 日韩亚洲欧美一区| 久久精品一区二区三区四区| 午夜国产一区| 欧美午夜剧场| 日韩视频在线观看一区二区| 亚洲国产另类久久久精品极度| 午夜久久黄色| 欧美亚洲一区二区三区| 欧美日韩精品一区二区在线播放| 欧美v日韩v国产v| 国产一区二区观看| 亚洲视频导航| 亚洲小视频在线| 欧美日韩精品国产| 最新中文字幕亚洲| 亚洲人成在线观看| 久久综合国产精品台湾中文娱乐网| 欧美在线一级视频| 国产精品在线看| 亚洲男女自偷自拍图片另类| 亚洲欧美另类综合偷拍| 国产精品都在这里| 一片黄亚洲嫩模| 亚洲午夜一区二区| 欧美日韩在线精品| 99精品视频免费在线观看| 日韩视频在线一区二区三区| 欧美精品激情blacked18| 亚洲全部视频| 在线一区亚洲| 国产精品夜夜夜| 亚洲女女女同性video| 欧美一区二区三区四区视频| 国产欧美午夜| 久久久久久久999| 亚洲国产福利在线| 亚洲视频一二| 国产精品热久久久久夜色精品三区 | 在线观看日韩专区| 美女国内精品自产拍在线播放| 欧美jizz19hd性欧美| 亚洲人成7777| 欧美日韩一二三四五区| 亚洲色无码播放| 久久精品国产一区二区电影| 伊人狠狠色丁香综合尤物| 欧美+亚洲+精品+三区| 亚洲精品网站在线播放gif| 亚洲视频精选| 国产永久精品大片wwwapp| 美女91精品| 亚洲视频在线播放| 亚洲精品美女91| 亚洲国产精品一区二区www在线| 欧美成人亚洲成人| 欧美sm重口味系列视频在线观看| 免费中文字幕日韩欧美| 亚洲人成在线观看网站高清| 一区二区三区欧美激情| 国产精品美女在线| 久久婷婷丁香| 一本色道久久综合狠狠躁篇的优点| 欧美制服第一页| 亚洲欧洲另类国产综合| 国产精品成av人在线视午夜片| 欧美一区二区视频在线观看| 欧美激情一区二区三级高清视频| 亚洲一区二区三区免费视频| 136国产福利精品导航网址| 国产精品qvod| 欧美成人一区二区三区在线观看 | 日韩亚洲欧美高清| 久久中文字幕导航| 亚洲男人第一av网站| 亚洲国产成人久久综合| 国产精品av久久久久久麻豆网| 久久精品最新地址| 亚洲视频在线观看免费| 亚洲电影观看| 久久频这里精品99香蕉| 亚洲一区二区精品在线| 亚洲精品1区| 国内成人自拍视频| 国产精品一区二区三区四区| 欧美搞黄网站| 玖玖在线精品| 久久爱另类一区二区小说| 亚洲一区一卡| 亚洲视频专区在线| 9色国产精品| 亚洲欧洲精品一区二区三区不卡| 久久久久久伊人| 久久xxxx| 午夜欧美精品久久久久久久| 亚洲网在线观看| 一区二区三区四区精品| 日韩视频不卡| 9i看片成人免费高清| 亚洲人成高清| 亚洲电影有码| 亚洲电影免费观看高清完整版在线观看 | 亚洲一区二区三区四区视频| 亚洲精品一区二区三区婷婷月| 欧美国产在线视频| 欧美韩国日本一区| 免费观看成人| 免费在线观看成人av| 久久青草欧美一区二区三区| 久久精品女人的天堂av| 久久黄色级2电影| 久久综合伊人77777| 久久九九热免费视频| 欧美一区免费| 久久亚洲精品欧美| 麻豆精品国产91久久久久久| 久久中文精品| 欧美高清你懂得| 亚洲国产成人久久综合一区| 亚洲国产成人久久| 国产精品视频久久| 麻豆av福利av久久av| 欧美一进一出视频| 久久国产精品99久久久久久老狼| 欧美一区二区精品久久911| 亚洲欧美一区二区原创| 欧美亚洲综合网| 久久久天天操| 欧美.www| 国产精品久久7| 国内精品免费在线观看| 亚洲国产成人精品久久| 亚洲三级视频| 亚洲网站在线| 久久精品99无色码中文字幕 |