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

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)的每一個表達式都有一個相應(yīng)的(corresponding)使用句點“.”符號(using dot notation)的(雖然是更冗長的(albeit more verbose))語法。

 

讓我們開始看看一個查詢表達式(query expression)的基本結(jié)構(gòu)(basic structure)。C# 里每一個合成的查詢表達式(syntactic query expression)都是從一個 from 子句(from clause)開始,到一個 select group 子句結(jié)束。這個最初的(initialfrom 子句能夠跟隨在(followed by)空的或多個(zero or more from where 子句后面。每個 from 子句都是一個發(fā)生器(generator)來傳入(introduces)一個涉及(ranging over)一個序列(a sequence)的迭代變量(an iteration variable),而每一個 where 子句是一個過濾器(filter)來排斥(excludes)結(jié)果中條目(items from the result)。最后的 select group 子句都可以加上一個 orderby 子句的前綴(be preceded by)用來指定結(jié)果集的排序(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" }
;

 

我們將得到下面的結(jié)果:

 

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 的使用會導(dǎo)致(causes)在我們外部的結(jié)果(in the outer result)中的內(nèi)部的查詢表達式(the inner query expression)變得呆板(to be flattened)。

 

我們對查詢表達式的簡單的語法(simplified grammar)從本節(jié)開始(from earlier in this section)就忽略了(omitted)一個很有用的特性(very useful feature)。在一個并發(fā)的查詢里(in a subsequent query)它是很有用的在將一個查詢的結(jié)果(results of one query)視為(treat as)一個發(fā)生器(a generator)的時候。為了支持這種特性,查詢表達式使用 into 關(guān)鍵詞來在一個 select group 子句之后結(jié)合(splice)一個新的查詢表達式。這里是這種簡單的語法來闡明(illustratesinto 關(guān)鍵詞是怎樣適應(yīng)(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 關(guān)鍵詞對后期處理(post-processing)一個 group by 子句的結(jié)果來說是特別有用的(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);
}

 

這段程序輸出下面的結(jié)果:

 

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)可以應(yīng)用于(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)是通過供應(yīng)(the provision of)兩個LINQ式的APItwo LINQ-enabled API's)提供的。其中一個名叫 DLinq,它是為基于SQL的數(shù)據(jù)訪問(SQL-based data access)提供的LINQ模式的實現(xiàn),另一個叫作 XLinq,它允許 LINQ 查詢 XML 數(shù)據(jù)。它們兩個都在下面的章節(jié)里描述。

 

 

 

 

 

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

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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            久久免费视频在线观看| 欧美午夜一区二区| 久久男人av资源网站| 欧美三区在线视频| 亚洲免费电影在线| 欧美激情成人在线视频| 欧美在线影院| 国产欧美在线看| 亚洲影院污污.| 亚洲精品你懂的| 久久精品国产亚洲精品| 国产精品入口| 欧美一区=区| 亚洲美女尤物影院| 亚洲一卡久久| 欧美性事免费在线观看| 亚洲韩国青草视频| 亚洲欧美日韩精品久久久久| 欧美黄色一区| 美女尤物久久精品| 激情五月综合色婷婷一区二区| 免费视频一区| 久久久久中文| 在线性视频日韩欧美| 欧美三级第一页| 午夜在线电影亚洲一区| 亚洲欧美一级二级三级| 国产日韩欧美精品在线| 久久综合九色| 欧美激情视频一区二区三区免费 | 欧美午夜一区二区| 亚洲欧美视频| 久久精品盗摄| 亚洲精品视频在线播放| 日韩亚洲欧美精品| 国产情人综合久久777777| 久久久久国产成人精品亚洲午夜| 欧美淫片网站| 国模精品娜娜一二三区| 久久久久一区二区| 欧美劲爆第一页| 亚洲一区二区三区在线观看视频 | 亚洲激情成人网| 欧美日韩dvd在线观看| 午夜精品久久久久久久99水蜜桃| 欧美亚洲色图校园春色| 国产欧美一区二区三区沐欲 | 欧美一区成人| 亚洲国产精品一区二区尤物区| 欧美77777| 欧美日韩亚洲综合一区| 欧美在线观看视频| 欧美一区二区三区四区在线 | 亚洲人线精品午夜| 亚洲神马久久| 在线观看精品一区| 日韩视频在线一区| 国产一区 二区 三区一级| 最新亚洲电影| 在线观看视频一区二区| 亚洲视频在线观看| 亚洲精品影院在线观看| 一区二区三区精品久久久| 亚洲天堂视频在线观看| 亚洲综合色丁香婷婷六月图片| 国产一区二区三区黄| 亚洲高清色综合| 国产美女一区| 99精品欧美一区| 亚洲欧洲三级| 久久国产精品99国产精| 亚洲免费在线观看| 欧美黄色aa电影| 久久嫩草精品久久久精品| 国产精品毛片一区二区三区| 亚洲国产一区二区精品专区| 韩日视频一区| 性色av一区二区三区在线观看 | 久久在线精品| 久久激情综合| 国产欧美一区二区三区国产幕精品| 亚洲欧洲一区| 狠狠干综合网| 亚洲欧美一区二区精品久久久| 中国日韩欧美久久久久久久久| 欧美激情亚洲视频| 亚洲黄色在线观看| 亚洲精品乱码久久久久久| 狼人天天伊人久久| 亚洲欧美日韩国产另类专区| 欧美日韩成人一区| 亚洲东热激情| 最新69国产成人精品视频免费| 夜色激情一区二区| 亚洲激情女人| 久久riav二区三区| 在线不卡中文字幕| 久久激情视频| 久久久久久97三级| 国产精品青草久久| 亚洲日本一区二区三区| 亚洲电影在线免费观看| 美女尤物久久精品| 亚洲日本va午夜在线电影 | 99精品视频网| 亚洲校园激情| 欧美午夜一区二区福利视频| 最新中文字幕亚洲| 一区二区三区日韩在线观看| 久久久久欧美精品| 久久久水蜜桃| 国产亚洲一级| 欧美在线网址| 国产精品自拍一区| 一区二区三区福利| aa国产精品| 国产精品久久久久久久久久久久久久| 一区二区三区成人| 欧美亚洲在线观看| 一区二区三区在线视频观看| 免费在线看成人av| 一本色道久久综合亚洲精品不| 久久av一区二区三区漫画| 精品福利av| 亚洲欧美怡红院| 亚洲激情电影在线| 久久婷婷国产综合精品青草| 男人天堂欧美日韩| 伊人久久久大香线蕉综合直播| 久久av二区| 亚洲精品中文字幕女同| 欧美一区成人| 在线看不卡av| 欧美视频精品在线观看| 久久精品九九| 亚洲裸体视频| 久久欧美中文字幕| 亚洲一区制服诱惑| 亚洲国产人成综合网站| 国产精品福利片| 玖玖国产精品视频| 亚洲欧美日韩电影| 亚洲老板91色精品久久| 久久久噜噜噜久噜久久| 在线综合亚洲欧美在线视频| 亚洲大胆女人| 国产一区自拍视频| 欧美性久久久| 欧美黄色免费网站| 久久精品视频在线| 中文在线资源观看网站视频免费不卡 | 欧美午夜精品久久久久久久| 亚洲欧美日韩在线播放| 亚洲国产精品嫩草影院| 久久久久网站| 欧美影院在线| 中文无字幕一区二区三区| 在线观看成人网| 国产日韩欧美视频| 国产精品美女久久| 欧美日韩亚洲一区三区 | 亚洲亚洲精品三区日韩精品在线视频| 国产模特精品视频久久久久| 欧美激情bt| 免费一级欧美片在线观看| 久久久精品动漫| 香蕉乱码成人久久天堂爱免费 | 国产精品久久久久影院色老大| 欧美www视频在线观看| 午夜欧美大尺度福利影院在线看| 亚洲精品视频免费| 欧美激情亚洲自拍| 欧美1区2区| 国产午夜精品视频免费不卡69堂| 欧美午夜免费| 欧美色另类天堂2015| 欧美日韩亚洲一区| 欧美日韩亚洲一区二区三区四区| 欧美日韩第一页| 欧美黄色一区二区| 欧美成人精品高清在线播放| 免费中文字幕日韩欧美| 男人插女人欧美| 免费日韩av电影| 欧美不卡视频一区发布| 久久精品国产在热久久| 久久久精品网| 久久伊人亚洲| 蜜臀久久99精品久久久画质超高清| 久热爱精品视频线路一| 久久青青草综合| 久久久久久久性| 老色鬼精品视频在线观看播放 | 一本色道久久| 一区二区三区视频观看| 亚洲欧美日韩在线观看a三区| 一区二区三区色| 亚洲欧美国产不卡| 久久国产88| 欧美激情亚洲国产|