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

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>
            亚洲欧洲美洲综合色网| 欧美高清在线一区| 亚洲一二三级电影| 国产精品综合| 久久亚洲欧美| 美女免费视频一区| 一区二区三区日韩精品| 亚洲一区二区三区精品在线 | 久久一区中文字幕| 久久人人超碰| 一本大道久久a久久精品综合| 99re视频这里只有精品| 国产乱码精品一区二区三区忘忧草| 久久久久久久久久码影片| 久久资源在线| 亚洲综合色自拍一区| 久久成人18免费网站| 亚洲美女色禁图| 亚洲一区二区高清视频| 在线观看日韩专区| 一本一本久久| 在线观看国产成人av片| 一区二区日本视频| 亚洲电影在线| 亚洲在线视频| 亚洲精品国产拍免费91在线| 亚洲一区二区三区午夜| 亚洲激情在线激情| 久久成人免费| 亚洲欧美电影在线观看| 欧美刺激性大交免费视频| 午夜精品影院在线观看| 女同性一区二区三区人了人一| 亚洲欧美日韩在线| 欧美国产一区二区三区激情无套| 欧美一区二区三区免费视| 欧美精品aa| 欧美成人免费小视频| 国产欧美一区二区三区视频 | 午夜精品一区二区三区电影天堂| 久久久91精品| 久久国产直播| 国产精品三级久久久久久电影| 亚洲二区视频| 在线观看成人一级片| 香蕉亚洲视频| 欧美亚洲三级| 国产精品白丝av嫩草影院| 亚洲激情校园春色| 亚洲高清不卡| 久久久五月婷婷| 久久久久国产精品麻豆ai换脸| 国产精品女主播| 99这里只有精品| 亚洲最快最全在线视频| 欧美不卡视频一区| 亚洲高清免费| 亚洲久久在线| 欧美日本二区| 亚洲最新视频在线播放| 一区二区三区国产在线观看| 欧美激情第六页| 亚洲激情欧美| 亚洲视频图片小说| 欧美日韩免费在线视频| 99精品视频免费观看| 亚洲一区尤物| 国产精品网站在线观看| 亚洲欧美日韩在线观看a三区| 欧美一区二区三区在线看| 国产欧美欧美| 久久久久久9999| 欧美激情aaaa| 一本久久综合亚洲鲁鲁| 欧美三级电影网| 亚洲嫩草精品久久| 久久天天躁狠狠躁夜夜av| 亚洲二区在线视频| 欧美另类久久久品| 亚洲午夜激情网站| 久久久久国产一区二区| 亚洲成人在线网| 欧美精品久久99| 亚洲一区二区高清| 蜜臀av一级做a爰片久久| 亚洲国产一区二区在线| 欧美日韩亚洲三区| 欧美一级播放| 亚洲成色精品| 欧美一区二区免费观在线| 影音先锋久久| 欧美另类在线播放| 亚洲综合好骚| 亚洲国产精品美女| 欧美一级免费视频| 亚洲欧洲综合另类在线| 国产精品国色综合久久| 玖玖综合伊人| 亚洲伊人伊色伊影伊综合网| 欧美二区在线| 久久成人免费电影| 99re8这里有精品热视频免费| 国产精品欧美精品| 欧美成人日韩| 欧美中文字幕精品| 一区二区三区视频免费在线观看| 美女视频黄免费的久久| 亚洲午夜精品网| 亚洲韩日在线| 国产主播一区二区三区四区| 欧美麻豆久久久久久中文| 久久爱另类一区二区小说| 一区二区三区视频在线看| 欧美xxxx在线观看| 久久www成人_看片免费不卡| 日韩亚洲欧美一区二区三区| 国产亚洲欧美一级| 国产精品高精视频免费| 欧美精品日韩一本| 久久久亚洲国产美女国产盗摄| 亚洲与欧洲av电影| 99这里有精品| 亚洲黄色成人| 欧美激情一区二区三区全黄| 久久精品国产久精国产爱| 亚洲女同精品视频| 亚洲一区二区精品在线| 亚洲看片一区| 亚洲精品网站在线播放gif| 1769国产精品| 亚洲第一区色| 亚洲国产精品久久久久秋霞不卡 | 国产精品一国产精品k频道56| 欧美激情一区三区| 欧美成人r级一区二区三区| 久久久久久久精| 久久久九九九九| 久久国产精品电影| 欧美在线一级视频| 久久国产66| 久久久久久久综合日本| 久久久综合网站| 玖玖玖免费嫩草在线影院一区| 久久久美女艺术照精彩视频福利播放| 欧美一区二区视频在线观看| 午夜精品久久久99热福利| 亚洲欧美日韩成人高清在线一区| 亚洲免费在线观看| 新狼窝色av性久久久久久| 欧美制服第一页| 久久香蕉国产线看观看网| 蜜桃视频一区| 欧美日韩亚洲综合| 国产精品激情电影| 国产一区白浆| 亚洲精品看片| 亚洲制服欧美中文字幕中文字幕| 午夜精品久久久久久久| 久久久91精品国产| 欧美激情一区二区三级高清视频| 亚洲国产美国国产综合一区二区| 亚洲精品孕妇| 性欧美xxxx大乳国产app| 久久久久国产一区二区三区四区| 欧美成人影音| 国产精品入口| 亚洲成人在线免费| 亚洲一卡久久| 美女日韩欧美| 一区二区高清视频在线观看| 午夜精彩视频在线观看不卡| 久久久999成人| 欧美日韩在线播放一区| 国产区亚洲区欧美区| 亚洲欧洲久久| 欧美制服丝袜第一页| 欧美高清在线一区二区| 亚洲视频一起| 女人天堂亚洲aⅴ在线观看| 国产精品久久久免费| 激情校园亚洲| 午夜欧美精品久久久久久久| 欧美aaaaaaaa牛牛影院| 亚洲图片在线| 欧美激情bt| 狠狠色丁香婷婷综合久久片| 这里只有精品丝袜| 久久综合网络一区二区| 亚洲精品免费观看| 久久久久www| 国产精品日本精品| 在线视频一区二区| 欧美~级网站不卡| 亚洲淫性视频| 欧美日韩亚洲一区二| 91久久精品日日躁夜夜躁国产| 久久爱www| 亚洲视频电影在线| 欧美日韩亚洲系列| 亚洲精选大片|