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

Javen-Studio 咖啡小屋

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

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

4.4         查詢語法(Query Syntax

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

 

建立在這種先例之上(Building on this precedent),查詢語法(query syntax)對大多數通用的查詢操作符(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 子句都是一個發生器(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)執行了(perform)一個基于方法名(method names)的機器翻譯處理(mechanical translation)。被選擇的(that is chosen)精確的查詢操作符的實現(exact query operator implementation)既依靠(depends both on)被查詢的變量的類型又依靠活動范圍(in scope)里的擴展方法(extension methods)。

 

查詢表達式展示了多么遙遠的(shown so far)未來,僅僅使用了一個發生器(only used one generator)。當不止一個的發生器(generator)被使用的時候,每一個并發的發生器(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;

 

當對下面的輸入的數組運行時:

 

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)從本節開始(from earlier in this section)就忽略了(omitted)一個很有用的特性(very useful feature)。在一個并發的查詢里(in a subsequent query)它是很有用的在將一個查詢的結果(results of one query)視為(treat as)一個發生器(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

 

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

 

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

 

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

 

 

 

 

 

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

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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电影| 日韩一区二区免费高清| 久久影院午夜片一区| 99亚洲一区二区| 亚洲精品国产品国语在线app| 午夜亚洲福利在线老司机| 久久久99爱| 亚洲欧美成aⅴ人在线观看| 亚洲免费伊人电影在线观看av| 狠狠色丁香婷婷综合| 国产精品亚洲综合天堂夜夜| 国产在线拍偷自揄拍精品| 美日韩精品免费| 国产亚洲永久域名| 久久久噜噜噜久久久| 亚洲黄色精品| 欧美一区二区免费观在线| 好吊色欧美一区二区三区四区| 欧美成人福利视频| 亚洲一卡久久| 欧美国产日韩亚洲一区| 亚洲欧美日韩在线综合| 亚洲高清久久网| 国产精品黄色在线观看| 久久在线精品| 99在线热播精品免费99热| 久久蜜臀精品av| 亚洲深夜福利在线| 1769国内精品视频在线播放| 欧美性猛片xxxx免费看久爱 | 99亚洲视频| 国产一区二区丝袜高跟鞋图片 | 亚洲一区中文| 亚洲福利视频一区二区| 久久精品国亚洲| 一区二区高清在线| 亚洲二区精品| 国产欧美精品久久| 欧美日精品一区视频| 久久久国际精品| 亚洲综合国产激情另类一区| 亚洲区一区二区三区| 久久综合给合| 久久都是精品| 亚洲女人小视频在线观看| 日韩视频二区| 亚洲国产成人高清精品| 国内精品久久久久影院 日本资源| 欧美三区在线| 欧美人与禽猛交乱配视频| 久久一综合视频| 久久精品欧美日韩| 性久久久久久| 亚洲欧美色婷婷| 亚洲香蕉网站| 中文一区二区在线观看| 亚洲国产精品一区在线观看不卡| 久久久噜噜噜久久久| 欧美在线影院在线视频| 午夜精品久久久久久99热软件| 夜夜嗨av一区二区三区| 亚洲日本欧美日韩高观看| 亚洲国产成人精品女人久久久| 久久久亚洲国产美女国产盗摄| 欧美一区二区三区免费看 | 亚洲人成小说网站色在线| 模特精品裸拍一区| 免费在线看成人av| 久久伊人免费视频| 美女脱光内衣内裤视频久久网站| 久久视频国产精品免费视频在线| 久久激情视频| 麻豆av一区二区三区久久| 久久精品国产亚洲5555| 久久久亚洲影院你懂的| 久久久久久久综合狠狠综合| 久久久久九九九九| 麻豆精品在线播放| 欧美激情国产日韩精品一区18| 亚洲高清免费视频| 亚洲欧洲午夜| 亚洲一区二区网站| 亚洲一区欧美二区| 久久国产一区二区| 另类成人小视频在线| 欧美久久久久久| 欧美日韩一区三区四区| 国产精品一区在线播放| 国产精品亚洲一区| 国产一区二区三区网站| 影音先锋亚洲精品| 日韩午夜一区| 亚洲主播在线| 欧美一级二级三级蜜桃| 久久精品人人做人人综合| 美日韩精品免费| 亚洲精品视频二区| 亚洲欧美在线网| 久久网站免费| 欧美手机在线视频| 国产日韩欧美日韩| 亚洲国产小视频| 亚洲影院污污.| 久久综合九色99| 亚洲欧洲精品一区二区三区波多野1战4| 99亚洲视频| 久久精品午夜| 欧美日韩伦理在线| 好看的av在线不卡观看| 一区电影在线观看| 久久亚洲精品欧美| 日韩一级二级三级| 久久久噜噜噜久噜久久| 欧美日精品一区视频| 一区二区在线观看视频| 一区二区三区日韩| 麻豆国产精品777777在线| 亚洲人www| 欧美在线高清视频| 欧美日韩国产123区| 国产一区二区三区免费不卡| 亚洲日本黄色| 久久久久亚洲综合| 99精品视频免费全部在线| 久久综合综合久久综合| 国产精品亚洲欧美| 亚洲最快最全在线视频| 久久这里有精品15一区二区三区| 一本一道久久综合狠狠老精东影业| 久久激情婷婷| 国产精品无码专区在线观看| 亚洲人妖在线| 美腿丝袜亚洲色图| 亚洲欧美国产制服动漫| 欧美日韩国产va另类| 亚洲国产1区| 久久久www成人免费精品| 亚洲午夜在线观看| 欧美日韩一二三区| 亚洲欧洲三级电影| 蜜桃久久av一区| 欧美亚洲视频一区二区| 国产精品成人一区| 99re成人精品视频| 欧美国产日产韩国视频| 久久精品视频在线观看| 在线免费观看成人网| 欧美体内谢she精2性欧美| 香蕉久久夜色精品| 一区二区精品| 99精品热视频只有精品10| 91久久在线视频| 欧美成人情趣视频| 欧美高清视频在线播放| 蜜臀av国产精品久久久久| 久久久国产精品一区二区三区| 久久国产福利| 亚洲欧洲精品天堂一级 | 欧美精品在线一区二区三区| 狠狠色狠色综合曰曰| 久久爱另类一区二区小说| 亚洲调教视频在线观看| 欧美午夜视频在线| 亚洲视频一起| 一区二区不卡在线视频 午夜欧美不卡在| 欧美顶级少妇做爰| 亚洲国产精品va在看黑人| 奶水喷射视频一区| 美女精品在线| 亚洲日本一区二区| 亚洲欧洲一区二区三区| 欧美美女操人视频| 亚洲综合激情| 亚洲手机成人高清视频| 国产精品视频免费观看| 欧美一区二区三区视频在线| 午夜视频一区| 亚洲成人自拍视频| 亚洲国产成人精品久久久国产成人一区| 欧美国产日韩视频| 亚洲图片欧美一区| 亚洲欧美国产毛片在线| 国产无遮挡一区二区三区毛片日本| 久久九九免费视频| 久久综合九色综合久99| 一区二区三区国产| 亚洲在线播放电影| 在线精品亚洲| 亚洲免费成人| 国产午夜精品理论片a级大结局| 你懂的亚洲视频| 欧美精品自拍| 久久福利资源站| 美日韩精品视频免费看| 亚洲一级在线观看| 欧美中文字幕在线播放| 1204国产成人精品视频|