• <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>

            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 閱讀(1166) 評論(0)  編輯 收藏 引用
            狠狠干狠狠久久| 国产高潮久久免费观看| 精品久久久中文字幕人妻| 99久久精品国产免看国产一区| 狠狠色婷婷综合天天久久丁香 | 久久久久97国产精华液好用吗| 久久天天躁狠狠躁夜夜不卡| 亚洲精品乱码久久久久久| 国内精品久久久久影院网站| 久久婷婷五月综合色高清| 日本久久久久久久久久| 国产综合久久久久| 久久久久久精品久久久久| 日本亚洲色大成网站WWW久久| 狠狠干狠狠久久| 国内精品久久久久久久coent | 久久黄视频| 日日躁夜夜躁狠狠久久AV| 四虎国产精品成人免费久久| 久久亚洲欧洲国产综合| 精品综合久久久久久97超人| 91麻豆精品国产91久久久久久 | 久久人人爽人人爽人人片AV不 | 久久99精品久久久久久9蜜桃| 久久国产精品免费一区| 亚洲精品乱码久久久久久蜜桃不卡 | 国产成人精品白浆久久69| 久久国产精品-久久精品| 久久这里的只有是精品23| 色婷婷久久综合中文久久蜜桃av| 久久久国产乱子伦精品作者| 99久久99久久精品国产| 国产精品一区二区久久国产| 久久黄色视频| 香蕉久久一区二区不卡无毒影院| 国产精品久久新婚兰兰| 91亚洲国产成人久久精品| 国产成人精品久久免费动漫| 久久精品人妻中文系列| 一本一本久久a久久精品综合麻豆| 久久精品国产亚洲精品2020|