專利名稱:允許元素類型的類型流的查詢模式的制作方法
允許元素類型的類型流的査詢模式
背景技術:
在計算機語言的領域中,傳統上有許多不同的語言類別。例如,許多編程 語言目的是為大多數最終用戶編程目標提供一般的解決方案,但另一方面,査 詢語言卻通常專用于基于對數據庫查詢的信息挖掘。多年來,已經進行了許多 嘗試來將査詢能力添加到編程語言,但是存在很多困難。
一個這樣的困難是大多數現代編程語言是基于面向對象的模型的,該模型 允許分層、抽象、模塊性、封裝和旨在降低編程任務的復雜度的若干其它范例。 另一方面,現代數據庫很大一部分是關系型數據庫,因此査詢語言往往是基于 關系模型而非面向對象的模型。
另 一困難是用于編程語言的開發環境(例如,集成開發環境(IDE))己 經進化成向開發者提供非常精密的協助手段,導致沒有這種開發環境來編程變 得很費勁。 一個示例是諸如自動完成實用程序或機制等內聯上下文信息。這些 自動完成機制在其中類、變量名和其它構造事先定義的面向對象的領域能起很 好的作用,但是通常不可用于查詢語言,因為對于自動完成所必需的元素類型 的類型檢查在編譯或轉換了查詢之前是不可用的。此外,查詢在完成該查詢之 前不能被轉換,這使得自動完成機制沒有實際意義。再者,如果查詢表達式是 不良地形成的,則編譯錯誤將是晦澀難解的且難以補救。
發明概述
以下提出了所要求保護的主題的簡化概述以提供對所要求保護的主題的 某些方面的基本理解。本概述并不是對所要求保護的主題的全面綜述。它既不 旨在標識所要求保護的主題的關鍵或重要的元素,也不描繪所要求保護的主題 的范圍。其唯一目的是以簡化的形式來介紹所要求保護的主題的一些概念,作 為稍后呈現的更為詳細的描述的前序部分。
此處所公開并要求保護的主題的一方面包括用于方便表達式中的運算符
5之間的元素類型的類型流的計算機實現的技術。運算符可以是,但不限于,査 詢運算符,并且由此,類型可以貫穿整個查詢表達式從一個查詢子句流到下一 査詢子句。
根據所要求保護的主題的一方面,運算符可被映射到相關聯的方法調用, 并且方法調用可以根據運算符模式來定義。由此,可期望表達式中的任何給定 運算符遵循形式化的運算符模式。相應地,算符以及整個表達式的項可以按照 所期望的方法調用來表達。可以理解,方法可以是實例方法、靜態方法、虛擬 方法或擴展方法。
據此,通過方便類型流并約束運算符以遵循運算符模式,此處所公開的體 系結構可以對表達式的每一子句遞增地推斷元素類型。例如,元素類型可以通 過將源類型與運算符相組合來確定,并且這可以對表達式的每一連續的子句實 時地完成。由此,類型信息可以本地地解析而無需完全轉換整個表達式。因此, 可以用較不昂貴(在資源利用方面)的方式且更快速地執行元素類型的類型檢 查,并且元素類型的類型檢查可以在表達式的構造期間而非僅在表達式被最終 化之后才實現,這可以產生附加的益處。
根據所要求保護的主題的一方面,一個這樣的附加益處是可以對于表達式 采用自動完成機制。例如,通過在進行中推斷元素類型,可提供基于可用類型 的上下文信息,這可以幫助表達式構造。
以下描述和附圖詳細闡明了所要求保護的主題的某些說明性方面。然而, 這些方面僅指示了可采用所要求保護的主題的原理的各種方法中的幾種,且所 要求保護的主題旨在包括所有這些方面及其等效方面。當結合附圖考慮以下所 要求保護的主題的詳細描述時,所要求保護的主題的其它優點和區別特征將變 得顯而易見。
附圖簡述
圖1是可采用查詢模式來方便元素類型的類型流的計算機實現的系統的 框圖。
圖2A示出了對于一示例性查詢表達式的非限制性代表性第一查詢子句和 各種非限制性代表性下一查詢子句。圖2B更詳細地示出了示例性查詢表達式的查詢子句以及元素類型的類型流。
圖3描繪了具有示例性輸入和輸出的査詢運算符模式的各種非限制性示例。
圖4是實時地推斷元素類型和/或基于所推斷的元素類型遞增地提供上下 文信息的計算機實現的系統的框圖。
圖5描繪了定義用于方便査詢表達式內的元素類型的類型流的計算機實 現的方法的過程的示例性流程圖。
圖6是可方便可組成查詢綜合和/或可擴展查詢表達式的計算機實現的系 統的框圖。
圖7示出了與從示例性査詢表達式的示例性查詢子句得到的控制變量的 范圍有關的示例性描述的框圖。
圖8描繪了定義用于方便以組成方式構造查詢綜合的計算機實現的方法 的過程的示例性流程圖。
圖9示出了可用于執行所公開的體系結構的計算機的框圖。
圖IO示出示例性計算環境的示意性框圖。
詳細描述
現在參考附圖來描述所要求保護的主題,所有附圖中使用相同的附圖標記 來指代相同的要素。在以下描述中,為解釋起見,闡明了眾多具體細節以提供 對所要求保護的主題的全面理解。然而,很明顯,所要求保護的主題可以在沒 有這些具體細節的情況下實施。在其它情況下,以框圖形式示出了公知的結構 和設備以便于描述所要求保護的主題。
如在本申請中所使用的,術語"組件"、"模塊"、"系統"、"接口" 等一般旨在表示計算機相關的實體,其可以是硬件、硬件和軟件的組合、軟件、 或者執行中的軟件。例如,組件可以是,但不限于是,在處理器上運行的進程、 處理器、對象、可執行碼、執行的線程、程序和/或計算機。作為說明,運行在 控制器上的應用程序和控制器都可以是組件。 一個或多個組件可以駐留在進程 和/或執行的線程中,并且組件可以位于一個計算機內和/或分布在兩個或更多的計算機之間。作為另一示例,接口可包括I/0組件以及相關聯的處理器、應 用程序、和/或API組件,并且可以像命令行那樣簡單,或者是更復雜的集成
開發環境(IDE)。
此外,所要求保護的主題可以使用產生控制計算機以實現所公開的主題的 軟件、固件、硬件或其任意組合的標準編程和/或工程技術而被實現為方法、裝 置或制品。在此使用的術語"制品"旨在涵蓋可以從任何計算機可讀設備、載 體或介質訪問的計算機程序。例如,計算機可讀介質可以包括但不限于磁存儲
設備(例如,硬盤、軟盤、磁帶……)、光盤(例如,緊致盤(CD)、數字 多功能盤(DVD)……)、智能卡和閃存設備(例如,卡、棒、鑰匙驅動器……)。 另外應該明白,可以采用載波來承載計算機可讀電子數據,例如那些用于發送 和接收電子郵件或用于訪問如因特網或局域網(LAN)等網絡的數據。當然, 本領域的技術人員將會認識到,在不背離所要求保護的主題的范圍或精祌的前 提下可以對這一配置進行許多修改。
此外,在此使用詞語"示例性"意指用作示例、實例或說明。在此被描述 為"示例性"的任何方面或設計并不一定要被解釋為相比其它方面或設計更優 選或有利。相反,使用詞語示例性旨在以具體的方式呈現各個概念。如本申請 中所使用的,術語"或"意指包括性"或"而非互斥性"或"。即,除非另有 指定或從上下文可以清楚,否則"X使用A或B"意指任何自然的包括性排列。 即,如果X使用A; X使用B;或X使用A和B兩者,則在任何以上情況下, 都滿足"X使用A或B"。另外,本申請中和所附權利要求書中所使用的冠詞 "一"和"一個" 一般應被解釋為是指"一個或多個",除非另有指定或從上
下文可以清楚指的是單數形式。
如在此所使用的,術語"推斷"或"推論"通常是指從經由事件和/或數 據捕捉的一組觀察結果中推斷或推理系統、環境和/或用戶的狀態的過程。例如, 推斷可用于標識特定的上下文或動作,或可生成狀態的概率分布。推斷可以是 概率性的,S卩,基于對數據和事件的考慮計算所關注狀態的概率分布。推斷也 可以指用于從一組事件和/或數據組成更高級事件的技術。這類推斷導致從一組 觀察到的事件和/或存儲的事件數據中構造新的事件或動作,而無論事件是否在 相鄰時間上相關,也無論事件和數據是來自一個還是若干個事件和數據源。現在參考附圖,最初參考圖l,描繪了能夠采用查詢模式來方便元素類型 的類型流的計算機實現的系統100。 一般而言,系統100可包括可操作地耦合 到公知的基于計算機的硬件(例如,控制器)、軟件(例如,應用程序)、以
及此處所描述的其它組件的用戶接口 102。用戶接口 102可接收查詢表達式 104,該表達式可包括第一查詢子句和一個或多個下一査詢子句。可以理解, 第一查詢子句可以包括可查詢源類型(例如,類集、流等)以及可由第一査詢 子句作為例如關于源類型的控制變量來引入的元素類型。通常,所有查詢子句 包括查詢運算符,然而,如所見的,査詢表達式104的下一査詢子句不必是完 整的,而是可以按部分(例如,增量式地)接收,諸如在子句由用戶輸入的時 候。查詢表達式104和相關的子分量在下文中結合圖2A和2B來更詳細地描 述。
系統100還可包括用于任何有效査詢運算符(例如,與第一査詢子句和后 續的下一查詢子句相關聯的查詢運算符)的查詢運算符模式106。因此,在例 如可操作地耦合到系統100的模式存儲108中可以存在任何數量的查詢運算符 模式106。特別地,來自查詢表達式104的查詢子句(例如,各自具有特定的 査詢運算符)可以符合相關聯的查詢運算符模式106,該模式可以定義例如可 訪問實例方法。通過符合查詢運算符模式106,可以實質上確保在一個查詢子 句和下一查詢子句之間存在已知關系,并且因此存在從一個查詢運算符到下一 查詢運算符的關系。査詢運算符模式106結合圖3來更詳細描述。
應該理解,通過對査詢表達式104施加約束以使查詢表達式104的運算符 符合查詢運算符模式106,系統100可以確保從查詢表達式104的一個查詢子 句/運算符到下一查詢子句/運算符的元素類型的類型流。此外,通過確保此處 所描述的元素類型流,可以在進行中實現某些有利的類型推斷和/或上下文判 定,而無需對完整查詢表達式104的常規轉換/編譯,如參考圖4更詳細討論的。 此外,上述推斷和/或判定可以在查詢表達式104完成之前,并甚至在查詢表達 式104的形式錯誤時提供。作為進一步的解釋而非限制,符合查詢運算符模式 106的示例查詢表達式104以及與該架構化相關聯的某些優點在下文中更詳細 描述。
仍參考圖l,但也轉向圖2A,示出了示例性查詢表達式104。 一般而言,查詢表達式104可以是向特定類集應用一系列査詢運算符的表達式。查詢運算
符是可跨值的類集一次應用于該整個類集的運算符(例如,FROM、 WHERE、 SELECT......)。查詢表達式104可包括第一査詢子句202,以及任何數量的
下一查詢子句20A、 2042等,其每一個都包含查詢運算符中的一個。
盡管可存在許多其它査詢運算符,并且這被認為是在所要求保護的主題的 精神和范圍之內,但是在下文中提供了多個具體示例以及對每一示例的簡要描 述。
FROM (從)運算符可以引入一個或多個控制變量,并且或者指定要查 詢的類集,或者為控制變量計算值。
RETURN (返回)和SELECT (選擇)運算符可以指定輸出類集的形狀。 在某些情況下,SELECT運算符可以引入新的控制變量。
WHERE (其中)和DISTINCT (不同)運算符可以限制類集的值。
ORDERBY (按……排序)運算符可以對類集施加排序。
SKIP (跳過)、SKIP WHILE (跳過同時)、TAKE (獲取)和TAKE WHILE
(獲取同時)運算符可以基于次序或條件返回類集的子集。
UNION (并)、UNIONALL (并全部)、EXCEPT (除夕卜)和INTERSECT
(交)運算符可以接收兩個類集并產生單個類集。
GROUP (組)運算符可以聚集類集并可返回按照關鍵字來分組的類集。
GROUPBY (按……分組)運算符可以基于一個或多個關鍵字來對類集 分組。在某些情況下,GROUPBY運算符可以引入新的控制變量。
AVG (平均)、SUM (求和)、COUNT (計數)、MIN (最小)和MAX
(最火)運算符可以聚集類集并產生值。
ANY (任何)禾卩ALL (全部)運算符可以聚集類集并基于條件返回布爾
(BOOLEAN)值。
JOIN (聯接)運算符可以接收兩個類集,并可以基于從元素中導出的匹 配關鍵字來產生單個類集。
GROUPJOIN (組聯接)運算符可以基于從元素中提取的匹配關鍵字來 對兩個類集執行分組聯接。
查詢表達式104中的查詢運算符的轉換可以按照運算符出現在查詢表達
10式104中的次序從左到右來進行。通常,查詢表達式104的第一個査詢子句202 包括FROM運算符,因為FROM運算符引入要査詢的類集。另外,査詢表達 式104中的最后一個查詢子句一般包括指定從查詢所得的類集的最終形狀的 RETURN禾B SELECT運算符。然而,可以理解,最后的SELECT或RETURN 運算符可被省略。例如,如果查詢表達式104不是以RETURN或SELECT運 算符結束,則可以假定隱含的SELECT運算符,這可將范圍中的所有控制變量 提升為所返回的匿名類型的屬性。此外,應當理解,查詢表達式104可以在應 用了 SELECT運算符之后繼續,在該情況下,后續運算符可訪問的控制變量僅 限于范圍中的那些控制變量。
根據所要求保護的主題的一方面,查詢表達式104可如下架構化 產錄表這式:=產紛運,淨身表 査錄運,辦表:=
Fraw運 I
^ #"^1^查 ^跪纖:= F固運,存I
紐,運#"符I
運餅f I (7rawp5y運,界 I Jo/"運## I 0冊/ Jo/"運,祭
為了提供用于所要求保護的主題的附加上下文以及相關編程實現和/或語
言的高級概覽,考慮示例性査詢表達式104的整體
Dim names =From C In Customers — Where C.State = "WA,,— Select C.Name
該査詢表達式104可以取Customer (顧客)對象的類集,并返回具有華盛頓 (WA)中的每一顧客的單個Name (姓名)屬性的行的類集。
很容易明白,查詢表達式104句法可以相當接近于標準關系型結構查詢語 言(SQL)句法,其意圖是熟悉SQL的任何人將能夠以極少的進一步指令來使 用查詢表達式104。然而,該句法不必受SQL約束,并且此外,查詢表達式 104不必是SQL到另一編程語言的轉換。由于SQL是圍繞純關系型模型來設 計的,因此其某些習慣用語在包含分層概念的類型系統中并不能起很好的作 用。另外,SQL通常采用的某些句法和語義元素會沖突或者不能與現有的編程 語言句法或語義很好地集成。由此,盡管查詢表達式104對于熟悉SQL的用 戶而言可以是直觀的,但是也可存在某些區別。
例如,在SQL以及諸如過程語言/結構化查詢語言(PLSQL)等其它語言 中,查詢和查詢的結果通過對整個査詢求值來綁定。由此,不需要能夠解釋所 應用的特定査詢運算符的元素類型。此外,這一判定在輸入了整個無錯誤的查 詢并且通過相對昂貴的轉換過程綁定之前是不能做出的。相反,所要求保護的 主題能夠將查詢表達式104輸入和查詢表達式104的結果按照特定源類型上的 個別査詢運算來綁定。這些和其它優點可以參考圖2B來更深入地示出。
圖2B更詳細地示出了示例性査詢表達式104的查詢子句。在該示例中, 第一查詢子句202包括第一查詢運算符(例如,FROM運算符206),其可用 語引入可査詢源類型(例如,Customers 208),并且可聲明用于該源類型的元 素類型的控制變量210 (例如,C)。如圖所示,第一査詢子句202的結果流 212到下一查詢子句204,(此處統稱為下一查詢子句204),使得在相鄰查詢 子句之間可存在已知關系。特別地,元素類型可流212到下一查詢運算符(例 如,WHERE運算符214)以用作下一查詢子句204,的源類型。同樣,下一查 詢子句204,的輸出流212到下一査詢子句2042,其中它與下一查詢運算符(例 如,SELECT運算符216)相關聯,該運算符也可產生流212到后續的下一查 詢子句204的元素類型或描述查詢表達式104的輸出的最終形狀。
12特別地,用于下一查詢子句204的每一個的查詢運算可以基于一組方法
(例如,查詢運算符模式106),其中每一方法與一特定査詢運算符相關聯,
并且被應用于類集或序列(例如,源類型)。這些査詢運算符可以相關于類集
的元素類型(或行)來定義。然而,給定具有元素類型T并應用了查詢運算符 的特定源類型,流212到下一査詢運算符204的結果可以是具有元素類型S的 類集。因此,流動212的元素類型可以根據與給定查詢運算符相關聯的査詢運 算符模式106來變換。例如,與諸如SELECT和RETURN等投影查詢運算符 相關聯的查詢運算符模式106 —般返回與從流212接收到的元素類型不同的元 素類型。
在本示例中,元素類型T (其可以是例如與Customer類型208相關聯的 所有控制變量210的聚集)流212到下一查詢子句的WHERE運算符214。 如將結合圖3描述的,與WHERE運算符214相關聯的查詢運算符模式106可 以過濾該類集的值,但是在其它方面通常不改變元素類型。此處,不在華盛頓 州的顧客從類集中過濾掉,但是流212到下一查詢運算符,即SELECT運算符 216的結果仍是具有元素類型Customer 208的類集。
另一方面,如果假定Name屬性是String (串)類型的,貝U SELECT運算 符216的結果是具有元素類型String的類集。對查詢結果同時支持SELECT和 RETURN運算符的組合可提供對運算符的輸入和輸出的可預測語義。另外,可 以促進更大的靈活性以在與關系型數據交互時精確地模仿期望的SQL語義。 此外,在產生非表結果時可以促進更大的簡單性,以及在迭代地形成查詢表達 式時可以促進對編譯器錯誤和所需改變的改進的定位。
另外,對于可查詢可擴展標記語言(XML)數據的類集的某些查詢語言 (例如,XQuery,其是包括某些編程語言特征的查詢語言);所要求保護的主 題也可結合XML文字來使用。例如,可以采用以下示例性查詢表達式104來 返回包括在華盛頓的所有顧客的姓名的XML元素類集,其類似于以上所討論 的示例性查詢表達式104的結果。 Dim names =—
From c In CustomersWhere c.State = "WA,, _
Hetum <Nams><%= c.Namc %></Name> 還可以理解,諸如,例如FROM、 SELECT和GROUPBY等某些查詢運 算符可以引入稱為控制變量(例如,控制變量C210)的一種特殊的局部變量。 默認地,控制變量的范圍可以定為從引入的運算符到可以隱藏該控制變量的運 算符,并且可以表示査詢所求值的類集中的個別行的屬性或列。例如,在以下
査詢中
Dim WACusts = 一
From C As Customer In Customers —
Where C.State = "WA" FROM運算符引入了類型為Customers的控制變量C。后面的WHERE査詢運 算符然后參考控制變量C在過濾表達式C.State^'WA"中表示每一個別顧客。
諸如DISTINCT等某些查詢運算符不必使用或改變控制變量。諸如 SELECT等其它查詢運算符可以在范圍中隱藏當前控制變量并且可引入新的控 制變量。例如,在以下查詢中 Dim YourUncles =—
From C In Customers —
Select LastName = C.Name 一
Where LastName.StartsWith("Bo,,) WHERE査詢運算符只能訪問由SELECT運算符引入的LastName (姓)控制 變量。如果WHERE運算符試圖引用C,則可能會導致編譯時錯誤。
現在參考圖3 (同時仍參考圖1),提供了查詢運算符模式的眾多非限制 示例。查詢運算符模式302-328是查詢運算符模式106的具體圖示,并且此處 由參考標號302-328來個別地引用,或者統稱為查詢運算符模式106。還可以 理解,若干査詢運算符模式106可適用于多個查詢運算符,即使多個查詢運算 符中涉及查詢運算符模式302-328中的單個模式的每一查詢運算符可具有將其 與多個査詢運算符中的其它運算符相區分的特性。此外,在某些情況下,特定 查詢運算符可以結合查詢運算符模式302-328中的一個以上模式來使用(例如, 重載函數)。一般而言,査詢運算符模式106可以是類型C必須實現以便可被査詢的
方法簽名。可以回想,查詢表達式104可以向特定類集應用一系列査詢運算符。
每一查詢運算符的控制變量可以是用于應用該特定査詢運算符的范圍中的全 部變量或全部變量的子集,而可從一個査詢運算符流到下一查詢運算符的元素
類型T可以是作為范圍中的全部控制變量的聚集的匿名類型。因此,查詢運算 符模式106可以特別地幫助確保類型C是可查詢類型。對于任何給定查詢表達 式104,如果以下條件的至少一個為真,則類型C是可査詢類型
(1) 類型C包括返回可查詢類型的具有簽名AsQuerable()的可訪問實例方法。
(2) 類型C包括返回正numerable(Of T)的具有簽名AsEnumerable()的可訪
問實例方法。
(3) 類型C實現符合査詢運算符模式302-328 (下文進一步詳述)的一個或 多個查詢運算符,并且對于在類型C上定義的所有查詢運算符,類型T必 須匹配并且不可以是開放類型參數。
參考查詢運算符模式302-328,査詢運算符模式302可包括FROM運算符。 在査詢表達式104中,FROM運算符通常在第一查詢子句中使用。由此,FROM 模式302可以引入查詢的源以及要使用的控制變量,并且可輸出具有元素類型 T的可查詢類型。應當理解,在對査詢表達式求值之前,如果類型C不滿足設 計模式(例如,不符合查詢運算符模式106),則可對查詢表達式104調用 AsQueryable或AsEnumerable方法,并且該函數的返回值可被存儲在臨時位置 中。
如上所述,FROM運算符可以引入可被査詢的類集以及可表示該類集中的 個別成員的控制變量。查詢表達式
From b As Book In Books ... 可被認為等價于
For Each b As Book In Books
Nextb
類集表達式運算數一般必須被分類為值并且必須是可查詢類型。FROM運算符所聲明的控制變量通常必須遵循用于相對于命名和定范圍來聲明局部變 量的常規規則(如以上句法轉換所暗示的)。由此,控制變量一般不能隱藏封 閉方法中的局部變量或參數的名稱。
應當理解,FROM運算符還可引入其值可由表達式而非類集來確定的控制 變量。這一特征可用于例如計算將在稍后的査詢運算符中使用多次的值(例如, 計算該值一次而非在隨后每次使用它時計算)。例如
Dim TaxedBookPrices =— From b in Books — From Tax = b.Price * 0.088 — Where Tax > 3.50 —
Select b.Price, Tax, Total = b.Price + Tax
可被認為等價于
For Each b In Books Dim Tax = b.Price * 0.088
Nextb
聲明表達式控制變量的FROM運算符的句法可以與FORLOOP中的控制 變量聲明相同,例外是該控制變量一般通過顯示初始化程序來初始化。不要求 表達式控制變量引用另一控制變量,因為這樣做可能是不確定值。表達式控制 變量通常不能是在查詢表達式104中聲明的第一控制變量。
出于簡短和/或方便的目的,FROM運算符的運算數可以省略AS子句, 在這一情況下,控制變量的類型可以從該變量范圍所在的類集或表達式來推 斷。如果控制變量的類型不能從查詢運算符方法中導出,則將導致編譯時錯誤。 FROM運算符可以在架構上如下定義 Fr簡運,/^f ::=
尸廠。m /吉鄉,緣:= Fraw聲鄉 I
尸r謹,剪,y表 , 尸r函,剪
16Fram聲敏=
,量標欽符[As類型名]In表這式I
變著蘆麵教
另外,盡管FROM運算符一般作為第一個查詢子句202的查詢運算符出 現,但是查詢表達式104可以包括一個以上FROM運算符。因此,當FROM 運算符是下一査詢子句204的査詢運算符時,則可導致叉積(例如,簡單、隱 式聯接)。在這一情況下,FROM運算符可以將新控制變量聯接(參見下文的 JOIN運算符模式324)到現有的控制變量集。結果可以是聯接的類集中的所有 元素的叉積。因此,例如,表達式
From b In Books 一
From p In Publishers —
可被認為等價于嵌套的For Each循環 For Each b In Books For Each p In Publishers
Next p Next b
前一查詢運算符中引入的控制變量可以在范圍內,并且可在包括在下一查 詢運算符204中的FROM運算符內使用。按照SQL,上述特征可被認為是支 持"相關子查詢"。例如,在以下查詢表達式中,第二個FROM運算符涉及第一 個控制變量的值
From c As Customer In Customers —
From o As Order In c.Orders —
Select c.Name, o
另外,在單個查詢子句中可以出現多個FROM運算符,在這一情況下, 運算數之間的逗號可以完全等價于下一查詢子句204中的另一FROM運算符。 由此,示例From b In Books, p In Publishers — Select b, p 可以等價于
From b In Books _ From p In Publishers _ Select b, p
查詢運算符模式304可以包括一查詢運算符,其是名為SELECT或 SELECTMANY的可訪問實例方法,該方法可以接收一函數作為自變量。函數 可以包括類型為T的自變量,并產生類型S。該方法可以返回具有元素類型S
的可查詢類型。
SELECT運算符可以描述查詢表達式104的結果。SELECT運算符可以取 聲明列表,并構造所得類集的元素類型。例如,如果査詢表達式104為 Dim CustAndOrderNames = 一
From c In Customers, o In c,Orders — Select c.Name, o,Product 則所得類型可以是IEnumerable(Of {Name As String, Product As String}),因為 Name的類型是String,且Product (產品)的類型是String。
后面的這一査詢(例如,查詢表達式104)可以等價于顯示地返回匿名類
型
Dim CustAndOrders = _
From c In Customers, o In c.Orders — Return New With { c.Name, o.Product}
如果SELECT運算符只有一個聲明,則結果可以是具有一個屬性的匿名 類型。由此,結果類型可以是正numerable (Of {Name As String}),因為Name 的類型是String。例如,
Dim CustNames =— From c In Customers Select c.Name
SELECT運算符中使用的聲明內的表達式在轉換成底層匿名類型之前被綁定。更具體而言,SELECT運算符中的聲明內的表達式可以開始成員訪問,
其中點運算符不必綁定到査詢中的控制變量。相反,點運算符可改為綁定到封
閉的WITH塊,如果存在這樣的塊的話。
應當理解,除了 SELECT運算符之外,查詢表達式104還可包括其它投 影運算符。例如,査詢表達式可以包括RETURN運算符,對于該運算符,可 以有相關聯的查詢運算符模式106。類似于SELECT運算符,RETURN運算符 可以描述査詢表達式104的結果。RETURN運算符可以取產生所得類集的元素 的表達式。例如,查詢
Dim ReducedBookPrices =— From b in Books — Return b.Price * .8 可產生被降低到其原始成本的80%的價格的類集。
以RETURN運算符結束的查詢表達式104的結果可以是其元素類型是所 返回的表達式的類型的類集。例如,在以下查詢表達式中,結果類型是 IEnumerable (OF String),因為c.Name的類型是String: Dim CustNames =—
From c In Customers — Return c.Name
如果查詢表達式104在沒有RETURN或SELECT運算符的情況下結束,
則所得的類集的元素類型可以是具有范圍中的所有控制變量的屬性的匿名類 型
'結果類型是IEnumerable(Of {Name As String, Product As String}) Dim CustNames =—
From c In Customers, O In C.Orders 即使SELECT運算符可以描述查詢表達式104的結果,但任何查詢表達 式104可在SELECT運算符之后繼續。在該情況下,由SELECT語句引入的 控制變量是范圍中的控制變量,但是所有先前的控制變量通常在范圍外 CustNames =—
From c In Customers, O In C.Orders —
19Select Name = C.Name, Price = O.Price Where Price 〉 500 Return Name
在SELECT運算符之后繼續的查詢表達式104可以等價于嵌套查詢 Dim CustNames =—
From X In (From c In Customers, O In C.Orders 一 Return New With { C.Name, O.Price ",— Name = X.Name, Price = X.Price Where Price > 500 Return Name
RETURN和SELECT運算符分別可基于以下示例來定義 運,祭 = Return 表這式 &/£"運#"符':=Select 5"e/",聲猶表 ^/e"聲剪^表:= M"聲剪I
5We",剪:=
變量聲麵教
查詢運算符模式306可以包括一査詢運算符,其是名為WHERE的可訪問 實例方法,該方法取一函數作為自變量。類型T可以是該函數的自變量,并且 結果可以是可被隱式地轉換成布爾類型的類型。例如,結果類型可以具有與可 在IF、 WHILE或DO語句中使用的表達式的類型相同的規則。因此,類型可 以具有到布爾類型的隱式轉換,或者需要己經定義了 IsTme和IsFalse運算符。 WHERE運算符可以返回具有元素類型T的可查詢類型。
WHERE運算符可以將類集中的值限于滿足給定條件的那些值。WHERE 運算符可以接收對每一組控制變量值求值的布爾表達式。如果表達式的值為 真,則該值可出現在輸出類集中,否則該值可被跳過。查詢表達式From b In Books, p In Publishers _ Where b.PublisherID = p.PublisherID _
可被認為等價于嵌套循環 For Each b In Books For Each p In Publishers
If b.PublisherID = p.PublisherID Then
End If
Nextp Nextb
WHERE運算符可被定義為 附we運#"# ::= Where 吝灰表這式
查詢運算符模式308可以包括一查詢運算符,其是名為ORDERBY或 ORDERBYDESCENDING (按降序排序)的可訪問實例方法,該方法可取一函 數作為自變量,該函數進而可取類型T的自變量,并產生類型S。與模式308 相關聯的方法可以返回具有元素類型T的己排序類集。
ORDERBY運算符可以基于一次序對出現在控制變量中的值排序。 ORDERBY運算符可以取指定應使用來對控制變量排序的值的表達式。例如, 以下查詢返回按照價格(Price)排序的書名(book.Title): From book In Books 一 Order By book.Price Select book.Title
排序可以是升序的,在這一情況下較小的值可以在較大的值之前出現;或 者排序可以是降序的,在這一情況下較大的值在較小的值之前出現。排序的默 認值是升序。例如,以下查詢返回按照價格排序的書名,且最貴的書在最前面 (Descending):From book In Books —Order By book.Price DescendingSelect book.TitleORDERBY運算符還可指定用于排序的多個表達式,在這一情況下類集可 以用嵌套方式來排序。例如,以下查詢表達式按照州(State),然后按照每一 州內的市(City),在按照每一市內的郵政編碼(ZIP),來對作者(Author) 排序From author In Authors —Order By author,State, author.City, author.ZIP —Select author.Name, author.State, author.City, author.ZIP ORDERBY運算符可以基于以下示例來架構化 (9W,運##::= Order By (9rafe廠表這式身表 CWe廠表這-tW表 :=O(ier表這式 ICVc/£T表這式身表 ,(9nier表這式 (9nsfer _|ll^"^C ::=表拔式[排序] 排序 =Ascending | Descending 另外,查詢運算符模式310可以包括一查詢運算符,其是名為DISTINCT 的為可訪問實例方法。通常,該方法返回具有與源類型C相同的元素類型的可 查詢類型。DISTINCT運算符可以將類集中的值僅限于具有不同值的那些(例 如,不返回重復值)。例如,查詢From c In Customers, o In c.Orders —Select c.Name, o.Price —Distinct將僅對每一對不同的顧客名和定單(Order)價格(Price)返回一行,即使該 顧客具有價格相同的多個定單。DISTINCT運算符可被架構化為 Z)/幼Vz"運,界=Distinct現在參考查詢運算符模式312,模式312可以包括一查詢運算符,其是名為CONCAT、 UNION、 INTERSECT或EXCEPT的可訪問實例方法。該方法 可以接收具有與源C相同的元素類型T的類集作為自變量,并返回具有元素類 型T的可查詢類型。下一查詢運算符模式,即模式314可以包括一查詢運算符,其是名為TAKE 或SKIP的可訪問實例方法,該方法可以接收值作為自變量,并且可以返回具 有與源類型C相同的元素類型的可查詢類型。TAKE運算符可以產生來自類集的給定數量的元素。當隨WHILE修飾符 一起使用時(參見例如査詢運算符模式316) , TAKE運算符可以在條件保持 為真時產生一元素序列。SKIP運算符可以忽略來自類集的給定數量的元素,然后返回該類集的其 余元素。當結合WHILE修飾符一起使用時,SKIP運算符在條件保持為真時跳 過元素,然后返回類集的剩余元素。TAKE和SKIP的一個示例架構如下提供。 尸flr加'ow運,存= 7"afe表這式 I Iz》表這式 表這式= Take [ While ] 表這式 i 1*表這式=Skip [ While ] 表達式 查詢運算符模式316可以包括一查詢運算符,其是名為TAKEWHILE或 SKIPWHILE的可訪問實例方法。該方法可取一函數作為自變量,其中該函數 可接收類型T的自變量,并產生布爾值。該方法可以返回具有元素類型T的可 查詢類型。查詢運算符模式318可以包括一查詢運算符,其是名為SUM、MIN、MAZ、 COUNT或AVERAGE的可訪問實例方法。該方法可取一函數作為自變量,其 中該函數進而接收類型T的自變量,并產生數值類型。該方法可返回數值類型。查詢運算符模式320可以包括一查詢運算符,其是名為MIN或MAX的 可訪問實例方法,該方法可取一函數作為自變量,該函數進而可取類型T的自 變量,并產生類型S。該方法可以返回具有元素類型S的可查詢類型。23査詢運算符模式322可以包括一査詢運算符,其是名為ANY或ALL的可 訪問實例方法,該方法可以接收一函數作為自變量。函數可以包括類型為T的 自變量,并產生可被隱式地轉換成布爾值的類型。該方法可返回可被隱式地轉 換成布爾值的類型。可以理解,與模式318-322相關聯的查詢運算符可以結合AGGREGATE (聚集)運算符來使用。在聚集查詢子句內,標準AGGREGATE運算符集可 被應用于范圍中的分組的控制變量。AGGREGATE運算符可括但不限于 ANY、 ALL、 COUNT、 LONGCOUNT (長計數)、SUM、 MIN、 MAX、 AVERAGE (平均)禾口/或GROUP 。ANY聚集運算符可以查明在組中是否有滿足給定條件的元素。ALL聚集 運算符可以確定是否組中的全部元素都滿足給定條件。例如,以下的示例查詢 表達式104可以檢查是否有低于18歲的任何顧客(cust.Age<18): From cust In Customers — Group By cust. State —Aggregate YoungerThan18 = Any(cust.Age < 18) 而以下示例査詢表達式104可以返回給定州中(cus.State)具有至少5個定單 的所有顧客(cust.Orders,Count()〉 5):From cust In Customers —Group By cust. State —Aggregate AtLeast5 = All(cust.Orders.CountO > 5) COUNT和LONGCOUNT聚集運算符可以取可任選布爾表達式,并對該 組中滿足給定條件的元素的數量計數。 From cust In Customers — Group By cust.State — Aggregate Seniors = Count(cust.Age > 50) SUM聚集運算符可以基于特定選擇器表達式來計算組中的元素之和。例 如,以下示例性查詢表達式104可以計算按照類別(Category)分組的所有定單的總值From order In OrdersGroup By order.Category Aggregate Total = Sum(order.Price)MIN和MAX聚集運算符可以基于某一選擇器表達式來計算組的元素的 最小值(或最大值)。例如,以下示例查詢表達式104可以計算每一州的最年 輕(Youngest)和最年長(Oldest)的顧客From cust In Customers —Group By cust. StateAggregate Oldest = Max(cust.Age), Youngest = Min(cust.Age) AVERAGE聚集運算符通常基于特定選擇器表達式來計算組中的元素的 平均值。例如,以下示例查詢表達式104可以計算按照類別分組的所有產品 (Products)的平均價格From prod In Products — Group By prod.CategoryAggregate AveragePrice = Average(prod.Price) 特殊的GROUP聚集運算符可以基于可任選選擇器表達式將組的所有元 素累積成顯式類集。例如,以下示例性查詢表達式104可以將給定州中的所有 顧客姓名收集到單個類集中。From cust In Customers — Group By cust. State Aggregate Names = Group(cust.Name) 查詢運算符模式324可以包括一查詢運算符,其是名為JOIN的可訪問實 例方法。該方法可以取以下各項作為自變量具有類型T'的元素的可査詢類型 S;用作內部選擇器的函數,其可取類型T的自變量,并產生表示關鍵字的類 型K;用作外部選擇器的函數,其可取類型T'作為自變量,并產生表示關鍵字 的類型K;和/或用作聯接條件的函數,其可取類型分別為T和r的兩個自變 量,并產生類型V的散列值。該方法可以返回具有元素類型V的可查詢類型。 因此,JOIN運算符可以取兩個類集,并可以基于從元素中導出的匹配關 鍵字來產生單個類集。在指定要聯接的條件時可以應用某些限制。例如,可以 要求對于條件表達式的運算數可被顯示地轉換為布爾值。JOIN架構的一個示例如下。場運 ::=Join凝if資劍:^量[As類智名]In表達式Where Jo/"殺斧表^"式 Jo/"條,表這式. . =i e/a"o"a/運,界表這式|緣e運餅表這式 查詢運算符模式326可以包括一查詢運算符,其是名為GROUPJOIN的可 訪問實例方法,該方法可以接收以下各項作為自變量具有類型T'的元素的可 査詢類型S;用作外部關鍵字選擇器的函數,其取類型T的自變量,并產生表 示關鍵字的類型K;用作內部關鍵字選擇器的函數,其取類型U的自變量,并 產生表示關鍵字的類型K;和/或可產生結果的函數,其中該函數可以取類型T 的自變量,以及具有元素類型U的類集的自變量,并產生所選類型V。該方法 可以返回具有元素類型V的可查詢類型。GROUPJOIN運算符可以基于從元素中提取的匹配關鍵字來創建兩個類 集的分組聯接。運算符可以產生分層結果(例如,與匹配的內部元素的類集配 對的外部元素),并且不需要關系型數據庫項中的直接等價物。以下示例查詢 表達式104可以執行顧客與其定單的分組聯接,從而產生具有顧客姓名以及該 顧客的定單總額(order/Total)的匿名類型的類集 From cust In db.Customers —Group Join order In db.Orders On cust.ID = order.CustID — Aggregate TotalOrders = Sum(order.Total)— Select cust.Name, TotalOrders可以有對固定集合操作以計算單個值的任何數量的附加運算符。在查詢的 上下文中,可以認為這些運算符聚集所計算的值。為對集合進行聚集,該集合 一般必須首先被引入。在査詢內,可以有各種方式來指定用于聚集計算的類集。 在引入了一個組后,該組可被聚集以計算單個值。因此,除了分組運算符 GROUPJOIN (以及以下結合查詢運算符模式328討論的GROUPBY)之外, 可存在其它分組運算符。 一個這樣的示例是OVER運算符。OVER運算符可以指定一個組應被累積以便進行聚集綜合。OVER運算符26可用作獨立表達式,或者其可用于指定應對聚集計算采用預形成的類集。例如, 以下示例査詢表達式104可以聚集2006年1月1日以前所有定單總額之和Over order In Orders _Where order.Date <= #01/01/2006# —Aggregate Sum(order.Total) OVER運算符的每次應用通常必須以相應的AGGREGATE運算符關閉來 基于類集內容計算單個值。查詢的結果可以是對應于聚集計算的單個值,在這 一情況下其是表示2006年以前的所有定單的總金額的整數。在OVER和AGGREGATE運算符之間可以使用可能任何查詢運算符。在 AGGREGATE運算符內,僅可對前一 OVER運算符指定的控制變量使用 AGGREGATE運算符(例如,與模式318-322相關聯的運算符,如上所述)。 當己經形成一個集合時,如通常是分層對象圖的情形,則可使用OVER 運算符來指定應對聚集計算使用一個集合。例如,以下示例性查詢表達式104 可以聚集2006年以前華盛頓的所有顧客發出的所有定單的總金額From cust In db.Customers —Where cust.State = "WA"—Over order In Orders —Where order.Date <= #01/01/2006# —Aggregate Sum(order.Total)該査詢的結果可以是其元素類型是具有以下兩個屬性的匿名類型的可査詢類型1)稱為cust的顧客屬性,和稱為Sum的整數屬性。查詢運算符模式328可以包括一查詢運算符,其是名為GROUPBY的可 訪問實例方法,該方法可取以下各項作為自變量用作關鍵字選擇器的函數, 其接收類型T的自變量,并產生表示關鍵字的類型K;和/或產生結果的函數, 其取類型K的自變量以及作為具有元素類型T的類集的自變量,并產生所選 類型V。該方法可以返回產生具有元素類型V的可査詢類型。GROUPBY運算符可以基于一個或多個共同的關鍵字表達式來對類集的 元素分組(例如,邏輯上)。對于初始類集的這些分區的每一個,后續的 AGGREGATE語句可以指定這些組的每一個如何被聚集成單個值或行。例如,以下示例性查詢表達式104可以按照州來對所有顧客分組,然后計算每一組的計數(Count)和平均年齡(AverageAge): From cust In Customers — Group By cust. StateAggregate Total = Count(), AverageAge = Avg(cust.Age) 與SELECT運算符一樣,GROUPBY運算符可以將在關鍵字選擇器中聲 明的變量作為控制變量帶入范圍中,并且可隱藏先前在范圍中的所有控制變 量。相反,與SELECT運算符的某些方面不同,這些隱藏的控制變量可以由在 后續的AGGREGATE運算符內使用的AGGREGATE運算符再次帶入范圍中。 此外,與OVER運算符的某些實現不同,在GROUPBY和AGGREGATE運算 符之間不能使用任何其它查詢運算符。From cust In Customers 一Group CustomersByState By cust.State 這一構造可以等價于通過顯式聚集來構造組,但是在GROUPBY運算符 子句之后立即終止查詢吋是有用的。由此,以上表達式可以等價于以下表達式From cust In Customers —Group By cust. State 一Aggregate CustomersByState = Group(cust)不必要求GROUPBY運算符的實際實現實際構建每一個別的組的表示。 相反,該實現可使用將分組與后續的聚集成單個運算相組合的底層實現。可以理解,控制變量的類型和名稱可以從查詢表達式104的目標以及所應 用的查詢運算符中推斷(將在下文中結合圖4來更詳細討論)。由此,元素類 型(其是范圍中的控制變量的聚集)可以用類似的方式來推斷。對于以上的每 一條規則,元素類型的所推斷的類型可以是T,并且當可查詢類型C是在例如 FOR EACH ... NEXT語句中使用的類集時,元素類型通常必須匹配元素類型T。還應當理解,已排序類集可被定義為實現以下運算符的子集的類集名為 THENBY或THENBYDESCENDING的、取一函數作為自變量的可訪問實例方 法,該函數取類型T的自變量,并產生類型S。該方法可以返回具有元素類型 T的已排序類集。由于查詢運算符模式106可以方便將查詢句法綁定到實現特定査詢運算 的方法,因此不需要由所采用的底層語言來規定次序保留。相反,次序保留可 以由運算符本身的實現來確定。這在要重載的實現方面可以類似于用戶定義的 運算符,例如,用于用戶定義的數值類型的加法運算符不能執行類似加法的任 何運算。然而,為保留所要求保護的主題內在的可預測性,實現不匹配用戶期 望的運算符可能不是推薦的過程。為幫助更完整地理解所要求保護的主題,現在可進一步討論其它特征、方 面和/或實現。例如,以下的某些節詳述了每一查詢運算符映射到對標準查詢運 算符方法的調用的示例性方式。其它節描述了如上引入的元素類型信息流的方 式,并且將在稍后的節中使用(例如,結合圖4和以下相關聯的描述)。查詢運算符轉換可以理解,各種查詢運算符的每一個可以直接映射到可根據標準查詢運算符模式(例如,查詢運算符模式106)來定義的方法調用。由此,查詢運算符 (或作為整體的查詢表達式)的含義可以按照要調用的査詢運算符方法來表 達。方法可以是所查詢的對象的實例方法,或對象外部的擴展方法。例如,査詢Dim names = _ From c In Customers — Where c.State = "WA"— Return c,Nam6可以等價于Dim names = Customers.Where(c => c.State).Select(c => c.Name) 合成控制變量盡管控制變量可由所要求保護的主題為此處所描述的各種目的而采用,但 是可以理解,控制變量一般不是對最終用戶直接可訪問的。諸如WHERE或 SELECT等某些查詢運算符取可以引用查詢中在范圍中的控制變量的表達式。 這些表達式被表達為取控制變量并返回表達式結果的局部函數。例如,查詢 Dim WACusts =— From cust In Customers29Where cust.State = "WA"可以等價于Dim WACusts = Customers.Where(c =〉 c.State = "WA") _ .Select(c => New With (c.Name"其中控制變量cust用作用于拉姆達表達式(lambda expression)的參數。 類似地,在多個控制變量在范圍中的情況下,控制變量通常必須被一起分組成單個匿名類型,以使它們可被傳入局部函數。例如,查詢 Dim WACustsAndOrders = _ From cust In Customers — From order In cust.Orders —Where cust.State = "WA" AndAlso order.Price > 10.50可以等價于Function Filter 1 (it As {c As Customer, o As Order}) As BooleanReturn it.c.State = "WA" AndAlso it.o.Price > 10,50 End FunctionFunction Joinl(c As Customer) As —IEnumerable(Of {c As Customer, o As Order}) Function Select l(o As Order) As {c As Customer, o As Order}Return New {c, o} End FunctionReturn c.Orders.Select(AddressOf Selectl) End FunctionDim WACustsAndOrders = 一 Customers. SelectMany(AddressOf Joinl).Where(AddressOf Filter 1)其中控制變量c和o被一起組合成稱為IT的合成控制變量,其類型是匿名類 型(c As Customer, o As Order}。還可以理解,也可以提供對于拉姆達表達式的支持,并且其被認為是在所 要求保護的主題的精神和范圍之內。還要注意,合成控制變量通常是不嵌套的。作為一個示例From b In Books _From ba In BookAuthors —From a In Authors —可以等價于Function Joinl(b As Book) As IEnumerable(OfAs Book, ba As BookAuthor})Function Selectl(ba As BookAuthor) As {b As Book, ba As BookAuthor}Return New { b, ba } End FunctionReturn BookAuthors.Select(AddressOf Selectl) End FunctionFunction Join2(it As {b As Book, ba As BookAuthor}) As —IEnumerable(Of {b As Book, ba As BookAuthor, a As Author" Function Select2(a As Author) As 一{b As Book, ba As BookAuthor, a As Author} Return New {b, ba, a} End FunctionReturn Authors.Select(AddressOf Join2) End FunctionBooks.SelectMany(AddressOf Joinl).SelectMany(AddresOf Join2) FROM運算符轉換標準FROM運算符一般僅引入査詢源以及要使用的控制變量。本質上, 它不轉換成任何特定查詢運算符調用。在JOIN的情況下,FROM運算符在與 常規控制變量聯接時可被轉換成對SELECTMANY査詢運算符方法的調用,而 在與表達式控制變量聯接時可被轉換成對SELECT查詢運算符方法的調用。因 此,查詢表達式31From b In Books, p In Publishers — Select b.Title, p.Name可以等價于Function Joinl(b As Book) As IEnumerable(Of {b As Book, p As Publisher})Function Select2(p As Publisher) As {b As Book, p As Publisher}Return New With {b, p} End FunctionReturn Publishers.Select(AddressOf Select2) End FunctionFunction Selectl(it As {b As Book, p As Publisher}) As — {Title As String, Name As String} Return New With {it.b.Title, it.p.Name} End FunctionBooks.SelectMany(AddressOf Joinl).Select(AddressOf Selectl) 并且査詢表達式From b In Books, Tax = b,Price * 0.088 — Select b.Title, Tax可以等價于Function Selectl(b As Book) As {b As Book, Tax As Double}Return New With {b, Tax = b.Price * 0.088} End FunctionFunction Select2(it As {b As Book, Tax As Double}) As {Title As String, Tax As Double} Return New With {it.b.Title, it.Tax} End FunctionBooks.Select(AddressOf Selectl).Select(AddressOf Select2)每一查詢運算符可被綁定到粘附到特定模式的源類型上的底層方法。該模 式規定了運算符的結果的元素類型,并且在某些情況下對可傳入底層方法的表達式施加了約束。顯式類型化的控制變量如果FROM運算符使用As子句為控制變量指定了目標類型Object (對 象),并且T的類型不能從源類型中推斷,則元素類型可以使用Case(Of Object) 運算符來轉換。查詢表達式 Dim nums =— From addrNum As Object In publisher.Address 一 Where addrNum < 5等價于-Function Filter 1 (addrNum As Integer) As BooleanReturn addrNum < 5 End FunctionDim names 二 publisher.Address.Cast(Of Object)O.Where(AddressOf Filterl)如果FROM運算符使用As子句為控制變量指定了目標類型T (不是 Object),并且T的類型不能從源類型中推斷或者如果目標類型不匹配源的元 素類型,則元素類型可以使用Cast (強制轉換)查詢運算符轉換成Object,并 且可利用后續的SELECT運算符來獲得目標類型。例如,查詢表達式 Dim nums =— From addrNum As Integer In publisher,Address — Where addrNum < 5等價于Function Filter 1 (addrNum As Integer) As BooleanReturn addrNum < 5 End FunctionFunction Select 1 (addrNum As Integer) As StringReturn addrNum End FunctionDim names = publisher.Address.Cast(Of Object)().Select(AddressOf33Select 1). Where(AddressOf Filter 1) 如果FROM運算符使用As子句為控制變量指定了目標類型T,并且T的 類型匹配源的元素類型,則不需要后續應用Cast或SELECT運算符。 WHERE運算符轉換WHERE運算符可被轉換成對Where査詢運算符方法的調用。例如,查詢 表達式From book In Books _Where book.PublisherID = 10 _Return book.Title可以等價于Books,Where(b => b.PublisherID = 10).Select(b => b.Title) ORDERBY運算符轉換ORDERBY運算符對于第一次排序可被轉換成對ORDERBY或 ORDERBYDESCENDING查詢運算符方法的調用(取決于排序的類型),并 且然后對于以后的排序被轉換成對THENBY和THENBYDESCENDING査詢 運算符方法的調用。例如,查詢表達式From a In Authors —Order By a.State, a.City Descending —Return a.Name 可以等價于Authors.OrderBy(a =〉 a.State).ThenByDescending(a => a.City),— Select(a => a.Name) RETURN和SELECT運算符轉換RETURN運算符可被轉換成對SELECT查詢運算符方法的調用。例如From e In Employees 一Hetum e.Name 可以等價于Employees.Select(e => e.Name) SELECT運算符可被轉換成對SELECT查詢運算符方法的調用以及匿名類型的構造。例如From e In Employees — Select e.Name, e.Salary可以等價于Employees.Select(e =〉 New With {e.Name, e.Salary}) DISTINCT運算符轉換DISTINCT運算符可被轉換成對DISTINCT查詢運算符方法的調用。例如: From e In Employees — Distinct可以等價于Employees.DistinctO TAKE或SKIP[WHILE]運算符轉換TAKE或SKIP運算符可以調用相應的TAKE或SKIP查詢運算符方法。例如From e In Employees — Order By e.Salary Descending — Rstum s.Nams Take 5可以等價于-Employees.OrderByDescending(e => e.Salary).Select(e => e.Name).Take(5)并且查詢From e In Employees — Order By e.Salary Descending — Return e.Name Skip 5可以等價于Employees.OrderByDescending(e => e.Salary).Select(e => e.Name).Skip(5)當結合WHILE修飾符使用時,可以創建條件表達式來應用于底層的TAKEWHILE或SKIPWHILE査詢運算符。例如,查詢 From e In Employees 一 Order By e.Salary Descending 一 Take While e.Salary > 50000 — Return e.Namc可以等價于Employees.OrderByDescending(e => e.Salary). 一 .TakeWhile(e => e.Salary > 50000).Select(e =〉 e.Name) GROUPBY和AGGREGATE運算符轉換后跟聚集SELECT或RETURN運算符的GROUPBY運算符可被轉換成對 后跟構造的組上的聚集的GROUPBY查詢運算符方法的調用。例如,査詢 From C In Customers — Group By C.State —Aggregate Youngest = Min(c.Age), Oldest = Max(c.Age) Select State, Youngest, Oldest 可以等價于Customers.GroupBy(c => New With { .State = c.State },— (g, k) => New With { .State = k,— .Youngest = g,Min(c => c.Age), .Oldest = g.Max(c => c.Age) }) 示例對象此處包括的所有示例使用兩個單獨的對象集中的一個。Company (公司) 對象可以表示關于一公司的信息,并且可以分層地連接 Class Company Dim Name As String Dim Employees As List(Of Employees) Dim Customers As List(Of Customer)36End Class Class CustomerDim Name As StringDim Orders As List(Of Order) End Class Class OrderDim Product As StringDim Price As Integer End Class Class EmployeeDim Name As StringDim Birthday As DateDim Position As StringDim Salary As Decimal End ClassDim Employees As List(Of Employee) Dim Customers As List(Of Customer) Book (書)對象可以表示關于例如書店中庫存的書的信息,并且可通過 關系連接Class BookDim BookID As LongDim Title As StringDim PublisherlD As LongDim Price As Double End Class Class AuthorDim AuthorlD As LongDim Name As StringDim Address As StringDim City As StringDim State As StringDim ZIP As String End Class Class BookAuthorDim BookID As LongDim AuthorID As Long End Class Class PublisherDim PublisherID As LongDim Name As StringDim Address As StringDim State As String End ClassDim Books As List(Of Book)Dim Authors As List(Of Author)Dim BookAuthors As List(Of BookAuthor)Dim Publishers As List(Of Publisher)在記住了以上內容之后,現在轉向圖4,描繪了可以實時地推斷元素類型 和/或基于所推斷的元素類型增量式地提供上下文信息的計算機實現的系統 400。 一般而言,系統400可以包括接收查詢表達式104的用戶接口 102,如基 本在上文結合圖l所描述的。另外,系統400可以包括可操作地耦合(未示出) 到用戶接口 102和/或上下文組件402的模式存儲108。上下文組件402可以檢 查查詢表達式104并實時地做出關于元素類型的推斷。例如,如上所述,由于 用于每一查詢子句的查詢運算符符合一特定模式(例如,圖1的查詢運算符模 式106),并且此外,由于元素類型可從一個查詢子句流到下一查詢子句,因 此這兩條信息可用于為任何給定下一查詢子句確定元素類型。當查詢運算符被描述為方法調用并且查詢運算作為純機制變換來應用時, --般要求類型解析在重載解析期間進行。以此方式,假定查詢運算符可將類型從一個運算符流到另一個,則運算符一般必須被完全綁定以便能夠將類型提供 給要應用的下一運算符。結果,如果重載解析由于句法錯誤或某一其它問題而 失敗,則沒有可用于向應用的下一運算符提供類型信息的常規機制。沒有這一 類型流機制的合成查詢運算符(以下從圖6開始更詳細討論)導致多余的錯誤 消息、不同的表達式語義、缺少用于自動完成的上下文信息、以及總體上更慢 的編譯器吞吐量。如所描述的,所要求保護的主題可以采用查詢運算符的模式的形式化,這 可允許元素類型不依賴于完全方法綁定,而是依賴于所采用的特定運算符的模 式。作為進一步說明,考慮由用戶接口 102接收的當前示例性查詢表達式104 (例如,在類型化査詢表達式104時)Dim q = From cust In Customers —Where cust.Name = "XYZ" & errorUnresolvedVarName 一 Select cust.第一個查詢子句包括FROM運算符,其可引入可查詢源類型"Customers"作為 匿名元素類型"cust",這可以是源類型的元素。如所討論的,該元素類型可以 流到下一査詢子句,其中WHERE運算符可以過濾該類集,但是在其它方面不 更改元素類型。最后,該元素類型流到下一査詢子句,其中可找到SELECT運 算符以及SELECT運算符方法期望接收的函數的一部分,但是下一查詢子句的 其余部分尚未完成。流入SELECT子句的元素類型現在可用于該特定查詢子句的源類型。上 下文組件402因此可以基于源類型和查詢運算符來實時地推斷該查詢子句的元 素類型(例如,cust)。因此,推斷可以完全是局部的,并且不需要對査詢表 達式104的完全轉換。相反,上下文組件402可以用類似于后臺編譯器的方式 來執行推斷。另外,上下文組件402的推斷可以用多種方式來促進更大的效率。例如, 推斷僅需在執行轉換時被執行一次。由此,如果在查詢表達式104中有兩個 WHERE運算符,則對第二個WHERE運算符的轉換不必是必需的。另夕卜,推 斷可以用于完全和通常更昂貴的編譯,以縮短一般必須執行的類型發現的巡 回。由此,事先推斷元素類型可以用各種方式來使用以加快編譯時間。此外, 一旦上下文組件402推斷了元素類型(此處,是"Select cust."查詢 子句中的"cust"),則上下文組件402可以增量式地提供上下文信息404。例如, 當點的類型是"cust."時,則上下文信息404可以用方便且熟悉的彈出窗口的形 式來動態地提供,以允許如圖所示或另一形式的自動完成。可以理解,這一特 征常規上對查詢表達式不可用,因為查詢表達式(常規上)在可確定元素類型 之前必須首先被轉換。并且,由于提供完整且無錯誤的查詢表達式是常規轉換 /編譯的先決條件,因此迄今為止阻礙了任何類似的上下文和/或自動完成機制。盡管上下文信息404對于査詢表達式有很大的效用,并且大部分在于IDE 中提供上下文反饋的上下文中示出,但是沒有一種情況是必需的。例如,此處 所描述的可適用于不僅僅是査詢表達式的查詢運算符。特別地,類型從一個運 算符流到下一運算符并在兩者之間有關系的概念可應用于其中類型流有用的 任何運算符或任何API。--個這樣的示例存在于將API調用鏈接在一起(例如, 包括在命令行中的流水線,其中目的是類型從一個命令流到下一個)。另一示 例可以是后綁定,其中沒有類型,但是可采用某種形式的流諸如用于后綁定的 優化。還可以理解,上下文組件402所執行的推斷可以完全基于所接收到的已知 信息來預定(例如,關于己知且定義的査詢運算符的源類型),或者根據其它 方面,推斷可以是概率性的。例如,當用于不同類型的運算符時,上下文組件 402可用于檢查可用數據的整體或其子集,并且能夠從經由事件和/或數據捕捉 的一組觀察結果中推出或推斷系統、環境和/或用戶的狀態。例如,推斷可用于 標識特定的上下文或動作,或可生成狀態的概率分布。推斷可以是概率性的, 即,基于數據和事件的考慮計算感興趣的狀態的概率分布。推斷也可以指用于 從一組事件和/或數據組成更高級事件的技術。這類推斷可導致從一組觀察到的事件和/或儲存的事件數據中構造新的事 件或動作,而無論事件是否在相鄰時間上相關,也無論事件和數據是來自一個 還是若干個事件和數據源。可采用各種分類(顯式和/或隱式訓練的)方案和/ 或系統(例如,支持向量機、神經網絡、專家系統、貝葉斯信任網絡、模糊邏 輯、數據融合引擎......)來執行關于所要求保護的主題的自動化和/或推斷的動作。分類器可以是將輸入屬性矢量x = (xl, x2, x3, x4, x")映射到該輸入屬于一個類的置信度的函數,即/r力-COM/ ^WCe(c/fl^)。這一分類可采用基于概率和/或基于統計的分析(例如,分解成分析效用和成本)來預測或推斷用戶期望自動執行的動作。支持向量機(SVM)是可采用的分類器的一個示例。SVM通 過找出可能輸入空間中的超曲面來操作,其中,超曲面試圖將觸發準則從非觸 發事件中分離出來。直觀上,這使得分類對于接近但不等同于訓練數據的測試 數據正確。可采用其它定向和非定向模型分類方法,包括,例如,樸素貝葉斯、 貝葉斯網絡、決策樹、神經網絡、模糊邏輯模型以及提供不同獨立性模式的概 率分類模型。此處所使用的分類也包括用于開發優先級模型的統計回歸。圖5示出了根據所要求保護的主題的方法。盡管出于簡化解釋的目的,該 方法和其它方法被示出和描述為一系列動作,但應該理解和明白,所要求保護 的主題不受動作的順序限制,因為某些動作能夠以與在此所示出和描述的不同 的順序發生和/或與其它動作同時發生。例如,本領域技術人員將會明白并理解, 方法可被替換地表示為 一系列相互關聯的狀態或事件,諸如以狀態圖的形式。 而且,并非所有示出的動作都是實現根據所要求保護的主題的方法所必需的。 另外還應該理解,下文以及本說明書全文中所公開的方法能夠被存儲在制品 上,以便于把此類方法傳送和轉移到計算機。在此使用的術語"制品"意指包含 可以從任何計算機可讀設備、載體或介質訪問的計算機程序。現在參考圖5,示出了用于方便元素類型的類型流的計算機實現的方法。 概括地,在參考標號502處,可接收包括查詢運算符的查詢子句的一部分。查 詢運算符可被映射到相關聯的方法調用,該方法調用可接收自變量(例如,函 數、值、類集......)并可返回類型化的結果(例如,可查詢類型、數值類型、已排序類集......)。該方法調用可以根據查詢運算符模式來定義。在參考標號504處,可利用源類型和査詢運算符來確定元素類型。例如, 由于查詢運算符模式可被形式化,因此查詢運算符的模式可結合源類型使用來 推斷元素類型。在參考標號506處,可采用前一查詢的元素類型作為參考標號 504處所討論的利用動作的源類型。據此,元素類型可以按遞歸的方式從一個 查詢子句流到下一查詢子句。在記住了上述內容之后,可以理解和明白,某些特征和/或方面可用于以其它方式來擴展編程語言的査詢能力。作為一個示例,此處所開發的方面可有 效地利用來提供基于計算機和/或基于語言的構造,如與常規上與API調用相 關聯的合成能力的綜合。這些和其它相關概念的描述可參考圖6找到。現在轉向圖6,提供了方便可組成査詢綜合和/或可擴展查詢表達式的計算機實現的系統600的框圖。 一般而言,系統600可包括可接收初始化數據604 的變換組件602。如圖所示,初始化數據604可以是示例性查詢表達式606中 的第一個査詢子句,其中該第一個査詢子句通常限于是FROM子句(例如, 第一個查詢子句的查詢運算符是FROM運算符)。初始化數據604可以包括 類集(例如,如圖所示的Customers)或表達式(例如,如上文結合關于圖3 詳述的FROM運算符描述的Tax:b.Price5^ 0.088)。在任一情況下,初始化數 據還可包括控制變量,取決于應用,該控制變量與類集(例如,C是控制變量) 或表達式(例如,Tax是控制變量)相關聯。變換組件602還可接收由查詢表達式606表征的序列中的一組查詢子句 608。可以理解,該組查詢子句608可以是空集,在這一情況下,查詢表達式 606由單個查詢子句構成(例如,用作初始化數據604的FROM子句),如將 在下文中更詳細描述的。如可以對初始數據604所完成的那樣,變換組件602 還可對組608中的每一查詢子句解析(例如,填充或變換)范圍中的控制變量。 例如,變換組件602可以進而通過向可用類型應用每一查詢子句的查詢運算符, 來以查詢表達式608所規定的次序處理組608中的每一查詢子句。可以理解,根據所要求保護的主題,該組查詢子句608不需要由諸如,例 如XQuery語言的各種版本所定義的FLWOR/FLWR或SQL的實現中所期望的 Sdect-From-Where等普遍存在的語義模板來限制。相反,組608可以在本質上 是合成的,使得個別査詢子句可被妥當地提供、以模塊化方式接合在一起、并 且即使在運算符的次序是任意的情況下也產生直觀結果。據此,系統600還可包括可管理查詢表達式606所引入的所有控制變量的 范圍的綜合組件610。控制變量的范圍可以基于査詢子句的運算符來確定,并 且范圍中的控制變量可被傳遞到下一査詢子句。例如,變換組件602可以確立 可被認為是流水線的事物,使得某些信息可通過流水線從一個查詢子句流到下 一査詢子句。由此,變換組件可以接收關于查詢子句的類集,基于與該查詢子句相關聯的運算符來變換(例如,過濾、投影......)該類集,并將所變換的類集輸出到流水線以使其可用于下一查詢子句。類似地,范圍中的控制變量也可被傳遞到下一查詢子句,并且精確而言什 么控制變量在范圍中可以由綜合組件610基于所接收到的查詢子句的類型來定 義。通常,下一査詢子句只能訪問在范圍中的變量。該特征以及其它特征可通 過除了圖6之外再參考圖7來進一步描述。圖7是涉及如可由綜合組件610所確定的示例查詢表達式606的控制變量 的范圍的示例性圖示。根據所要求保護的主題的一方面,綜合組件610可以基 于查詢子句/運算符的類型來聲明新的控制變量(并且可將該新的控制變量帶入 范圍)。例如,某些類型的查詢子句可以除了己經在范圍中的控制變量之外還 引入新的控制變量,即,FROM、 LET、 SELECT或GROUPBY查詢子句可產 生這 -結果。由FROM子句引入的控制變量通常被累積,直到下一 SELECT 或GROUPBY子句,在這之后它們可由綜合組件610帶出范圍。這一情況由 FROM子句702、 704 (映射到初始化數據604以及包括在査詢子句組608中 的初始查詢子句)示出,其控制變量停留在范圍中,直到應用了 SELECT子句 710。子句702引入Customer類集和控制變量C。因此,該信息可以通過流水 線提供給下一查詢子句。因此,可以使(C AsCustomer)對子句704可用。子句 704也是FROM子句,這由于所要求保護的主題的合成本質是可能的。子句 704采用了控制變量C來引入新的類集C.Orders (例如,所有顧客的所有定單) 以及新的控制變量O,綜合組件610可將該新的控制變量帶入范圍。由此,下 一査詢子句706能夠訪問范圍中的兩個控制變量C和O。基本如以上所描述的,盡管某些查詢子句類型可影響范圍中的變量,但是 其它査詢子句類型(例如,WHERE、 ORDERBY、 DISTINCT等)卻不必。由 此,盡管査詢子句706和708可影響類集,但范圍中的變量(例如C和O)可 以相同,并且因此可分別由查詢子句708和710在其各自由變換組件602接收 時訪問。根據所要求保護的主題的一方面,綜合組件610可以基于所接收到的查詢 子句的類型將現有控制變量帶出范圍。SELECT查詢子句710提供了該特征的表征圖示。査詢子句710被展示給控制變量C和0,但是SELECT子句的特 征之一可以是隱藏范圍中的當前控制變量并在范圍中引入新的控制變量(例 如,Name As String和Price As Int)。可以向査詢子句712提供這些新的控制 變量Name和Price,但是査詢子句712 —般不能訪問綜合組件610關于SELECT 子句710帶出范圍的先前的控制變量(例如,C和O)。為完整性起見,應注 意幾個特征。首先,查詢子句710示出了逗號分割的復合運算數的又一示例。 要注意的第二個特征是WHERE子句712在SELECT子句710之后。常 規的查詢語言在應用了具有諸如SELECT、 RETURN等投影運算符或類似的運 算符的查詢子句之后終止查詢。如果這一常規查詢語言的用戶希望在投影之后 繼續查詢運算,則必須實現可引用前一查詢的結果的新查詢。然而,由于例如 所要求保護的主題的合成本質,查詢表達式606可以包括多個SELECT子句, 并且查詢表達式606可以在出現SELECT子句之后繼續(例如,由子句712示 出)。類似地,盡管在前一節中提到,但應指出,查詢表達式606也包括兩個 FROM子句(例如,子句702和704),這是常規查詢語言所無法提供的另一 方面。盡管未由解釋示例描繪,但査詢表達式606還可包括其它查詢子句類型, 并且特別地,這些其它查詢子句類型中的許多可影響控制變量的范圍。例如, 在接收到RETURN子句之后,綜合組件610可以將所有變量帶出范圍。作為 另一示例,基于查詢子句的類型,綜合組件610可以聲明新的控制變量并對其 定范圍(例如,帶入范圍),同時為特定一組后續查詢子句確定現存的控制變 量(例如,對于前一查詢子句在范圍中的控制變量)的范圍。GROUPBY、 AGGREGATE等可方便這一行為,由此現存控制變量的范圍可被定在跨每一 GROUP運算符的AGGREGATE查詢子句的范圍上。根據所要求保護的主題的另一方面,綜合組件610可以基于所接收到的查 詢子句的類型為范圍中的所有控制變量的元組生成別名。例如,INTO查詢子 句可以方便例如由綜合組件610來創建別名,即使該別名本身不需要是控制變仍參考圖6和7,可強調所要求保護的主題的各種附加方面。盡管有與有 效查詢表達式606的可擴展性有關的多個優點(例如,查詢表達式606可用實際上任何數量的實際上任何類型的査詢子句來擴展),但另一優點可以是査詢
表達式606也可以在任何點終止。由此,盡管査詢表達式606有可能包括無限 數量的查詢子句,但整個査詢表達式606也可由僅單個在引入了單個控制變量 之后終止的查詢子句組成。因此,完整且有效的査詢表達式606的最簡單的示 例之一是僅包括初始化數據604的查詢表達式606:
From C In Customers 而不要求查詢表達式606包括顯式的SELECT、 RETURN或其它終止査詢運算 符。
作為解釋,變換組件602可被配置成向接收到的每一査詢子句追加隱式 SELECT或RETURN。由此,只要包括在流水線中的所得類集處于期望的形狀, 就不需要顯式語句來選擇或返回這些中間結果。相反,如果查詢表達式606在 給定子句,例如702-708中的任一個之后結束,則流水線中的類集可以輸出結 果,并且可以基于范圍中的控制變量的數目來推斷輸出的格式。
例如,如果查詢表達式606在子句704-708中的任一個之后終止(其中在 每一情況下范圍中有兩個控制變量C和0),則可以推斷所需輸出應作為名-值對的類集存在。因此,輸出可以是對每一控制變量有一字段的元組。另 -方 面,在范圍中僅有一個控制變量的情況下,諸如在子句702之后,則查詢表達 式606的實現器通常將不期望得回具有字段c的元組。相反,實現器可能期望 顧客的類集。因此,在范圍中僅有一個控制變量的情況下,輸出可以僅僅是類 集的底層值。
根據所要求保護的主題的一方面,由FROM子句引入的控制變量可以與 表達式以及類集相關聯。作為一個代表性示例,考慮以下如上所述的查詢片段 From b in Books 一 From Tax = b.Price * 0.088 — 第一個FROM子句為類集Books引入控制變量b,該控制變量被帶入范 圍并可由下一査詢子句來訪問。下一 FROM子句引入與表達式(而非類集) b.Price * 0.088相關聯的控制變量Tax。對于兩個FROM子句中的后者,效果 可以是為表達式的結果提供了可訪問名稱。該名稱可由控制變量tax來引用, 該控制變量可保留在范圍中,直到例如后續的SELECT子句。該特征可被認為
45類似于查詢中的過程語句,這可允許表達式的值被計算一次,即使該值隨后可 被多次采用,也不需要重新計算該值。
根據所要求保護的主題的另一方面,可以在單個查詢表達式606的上下文 中采用集合運算。盡管常規查詢語言通常僅提供單個類集作為輸入,但是變換
組件602可以接收兩個類集作為輸入。例如,變換組件602可被配置成接收多 個類集,并可輸出具有與根據查詢子句的類型(例如,UNION子句、INTERSECT 子句......)合并的多個類集相關聯的控制變量的單個類集。合并的控制變量可
被帶入范圍、通過相關聯的集合運算符傳遞、并對下一查詢子句可訪問,因此 查詢表達式606可繼續。控制變量一般必須是相同的類型,并且一般必須具有 相同的名稱,但是當然,它們可以與兩個不同的類集相關聯。
現在轉向圖8,示出了用于方便以合成方式構造查詢綜合的計算機實現的 方法800。從參考標號802開始,可獲得類集(或表達式)以及與該類集(或 表達式)相關聯的控制變量。 一般而言,該獲得的數據是查詢表達式的第一個 査詢子句,通常是FROM子句的產物。在參考標號804處,可接收包括在查 詢表達式中的 -組查詢子句的當前査詢子句。可以理解,與要求綜合是整體式 的常規語言不同,不需要對當前查詢子句,或在很大程度上對作為整體的查詢 表達式施加句法排序限制。
在參考標號806處,可根據當前查詢子句來修改類集。簡言之,作為輸入 接收的類集可以基于與當前查詢子句相關聯的査詢運算符的方針來變換。可以 理解,當前査詢子句可以根據與當前查詢子句相關聯的期望類型而非基于整體 式句法模板來求值。接著,在參考標號808處,可將經修改的類集通過流水線 傳送到下一查詢子句。因此,當前查詢子句的輸出可用作下一查詢子句的輸入。
在參考標號810處,可基于當前查詢子句來確定控制變量的范圍。例如, 某些類型的查詢子句不便于對現存控制變量進行任何改變,而其它查詢子句則 可方便引入新的控制變量(在某些情況下僅對于特定的一系列下一查詢子句), 而還有一些則可方便在(可任選地)引入新控制變量的同時將現存控制變量帶 出范圍。在參考標號812處,可將對當前査詢子句的范圍中控制變量的訪問提 供給下一查詢子句。
現在參考圖9,所示是可用于執行所公開的體系結構的示例性計算機系統的框圖。為了為本發明各個方面提供附加上下文,圖9和下列討論旨在提供對 其中可實現本發明的各方面的合適的計算環境900的簡要概括的描述。另外,
盡管本發明以上是在可在一個或多個計算機上運行的計算機可執行指令的一 般上下文中進行描述的,但是本領域的技術人員將認識到,本發明也可結合其 它程序模塊和/或作為硬件和軟件的組合來實現。
一般而言,程序模塊包括執行特定任務或實現特定抽象數據類型的例程、 程序、組件、數據結構等等。此外,本領域的技術人員可以理解,本發明的方 法可用其它計算機系統配置來實施,包括單處理器或多處理器計算機系統、小 型機、大型計算機、以及個人計算機、手持式計算設備、基于微處理器的或可 編程消費電子產品等,其每一個都可操作上耦合到一個或多個相關聯的設備。
本發明的所示方面也可以在其中特定任務由通過通信網絡鏈接的遠程處 理設備執行的分布式計算環境中實踐。在分布式計算環境中,程序模塊可以位 于本地和遠程存儲器存儲設備中。
計算機通常包括各種計算機可讀介質。計算機可讀介質可以是可由計算機 訪問的任何可用介質,并包括易失性和非易失性介質、可移動和不可移動介質。 作為示例而非限制,計算機可讀介質可以包括計算機存儲介質和通信介質。計 算機存儲介質可包括以用于存儲諸如計算機可讀指令、數據結構、程序模塊或 其它數據這樣的信息的任意方法或技術來實現的易失性和非易失性、可移動和
不可移動介質。計算機存儲介質包括但不限于,RAM、 ROM、 EEPROM、閃 存或其它存儲器技術、CD-ROM、數字多功能盤(DVD)或其它光盤存儲、磁 盒、磁帶、磁盤存儲或其它磁存儲設備、或可以用來儲存所期望的信息并可由 計算機訪問的任何其它介質。
通信介質通常以諸如載波或其它傳輸機制等已調制數據信號來體現計算 機可讀指令、數據結構、程序模塊或其它數據,且包含任何信息傳遞介質。術 語"已調制數據信號"指的是其一個或多個特征以在信號中編碼信息的方式被 設定或更改的信號。作為示例而非限制,通信介質包括有線介質,諸如有線網 絡或直接線連接,以及無線介質,諸如聲學、RF、紅外線和其它無線介質。上 述中的任意組合也應包括在計算機可讀介質的范圍之內。
再次參見圖9,用于實現本發明的各方面的示例性環境900包括計算機902,計算機902包括處理單元904、系統存儲器906和系統總線908。系統總 線908將包括但不限于系統存儲器906的系統組件耦合到處理單元904。處理 單元904可以是市場上可購買到的各種處理器中的任意一種。雙微處理器和其 它多處理器體系結構也可用作處理單元904。
系統總線908可以是若干種總線結構中的任一種,這些總線結構還可互連 到存儲器總線(帶有或沒有存儲器控制器)、外圍總線、以及使用各類市場上 可購買到的總線體系結構中的任一種的局部總線。系統存儲器906包括只讀存 儲器(ROM) 910和隨機存取存儲器(RAM) 912。基本輸入/輸出系統(BIOS) 儲存在諸如ROM、 EPROM、 EEPROM等非易失性存儲器910中,其中BIOS 包含幫助諸如在啟動期間在計算機902內的元件之間傳輸信息的基本例程。 RAM 912還可包括諸如靜態RAM等高速RAM來用于高速緩存數據。
計算機卯2還包括內部硬盤驅動器(HDD) 914 (例如,EIDE、 SATA), 該內部硬盤驅動器914還可被配置成在合適的機殼(未示出)中外部使用;磁 軟盤驅動器(FDD) 916 (例如,從可移動磁盤918中讀取或向其寫入);以 及光盤驅動器920 (例如,從CD-ROM盤922中讀取,或從諸如DVD等高容 量光學介質中讀取或向其寫入)。硬盤驅動器914、磁盤驅動器916和光盤驅 動器920可分別通過硬盤驅動器接口 924、磁盤驅動器接口 926和光盤驅動器 接口 928連接到系統總線908。用于外置驅動器實現的接口 924包括通用串行 總線(USB)和IEEE 1394接口技術中的至少一種或兩者。其它外置驅動器連 接技術也在本發明的預期中。
驅動器及其相關聯的計算機可讀介質提供了對數據、數據結構、計算機可 執行指令等的非易失性存儲。對于計算機902,驅動器和介質容納適當的數字 格式的任何數據的存儲。盡管上面對計算機可讀介質的描述涉及HDD、可移 動磁盤和諸如CD或DVD等可移動光學介質,但本領域的技術人員應該意識 到,在示例性操作環境中也可以使用可由計算機讀取的其他類型的介質,如 ZIP驅動器、磁帶盒、閃存卡、盒式磁帶等等,并且此外,任何這種介質都可 以包含用于執行本發明的方法的計算機可執行指令。
多個程序模塊可存儲在驅動器和RAM 912中,包括操作系統930、 一個 或多個應用程序932、其它程序模塊934和程序數據936。所有或部分操作系
48統、應用程序、模塊和/或數據也可被高速緩存在RAM912中。應該明白,本 發明可以用各種市場上可購買到的操作系統或操作系統的組合來實現。
用戶可以通過一個或多個有線/無線輸入設備,例如鍵盤938和諸如鼠標 940等定點設備將命令和信息輸入到計算機902中。其它輸入設備(未示出) 可包括話筒、IR遙控器、操縱桿、游戲手柄、指示筆、觸摸屏等等。這些和其 它輸入設備通常通過耦合到系統總線908的輸入設備接口 942連接到處理單元 904,但也可通過其它接口連接,如并行端口、 IEEE 1394串行端口、游戲端口、 USB端口、 IR接口等等。
監視器944或其它類型的顯示設備也經由諸如視頻適配器946等接口來連 接到系統總線908。除了監視器944之外,計算機通常包括諸如揚聲器、打印 機等其它外圍輸出設備(未示出)。
計算機902可使用經由有線和/或無線通信至一個或多個遠程計算機,諸
如遠程計算機948的邏輯連接在網絡化環境中操作。遠程計算機948可以是工
作站、服務器計算機、路由器、個人計算機、便攜式計算機、基于微處理器的
娛樂設備、對等設備或其它常見的網絡節點,并且通常包括以上相對于計算機
902描述的許多或所有元件,盡管為簡明起見僅示出了存儲器/存儲設備950。
所描繪的邏輯連接包括到局域網(LAN) 952和/或例如廣域網(WAN) 954
等更大的網絡的有線/無線連接。這一 LAN和WAN聯網環境常見于辦公室和
公司,并且便于諸如內聯網等企業范圍計算機網絡,所有這些都可連接到例如 因特網等全球通信網絡。
當在LAN網絡環境中使用時,計算機902通過有線和/或無線通信網絡接 口或適配器956連接到局域網952。適配器956可以便于到LAN 952的有線或 無線通信,并且還可包括其上設置的用于與無線適配器956通信的無線接入點。
當在WAN連網環境中使用時,計算機902可包括調制解調器958,或連 接到WAN 954上的通信服務器,或具有用于通過WAN 954,諸如通過因特網 建立通信的其它裝置。或為內置或為外置的調制解調器958以及有線或無線設 備經由串行端口接口 942連接到系統總線908。在網絡化環境中,相對于計算 機902所描述的程序模塊或其部分可以存儲在遠程存儲器/存儲設備950中。應 該理解,所示網絡連接是示例性的,并且可以使用在計算機之間建立通信鏈路的其它手段。
計算機902可用于與操作上設置在無線通信中的任何無線設備或實體通 信,這些設備或實體例如有打印機、掃描儀、臺式和/或便攜式計算機、便攜式 數據助理、通信衛星、與無線可檢測標簽相關聯的任何一個設備或位置(例如, 公用電話亭、報亭、休息室)以及電話。這至少包括Wi-Fi和藍牙TM無線技術。 由此,通信可以如對于常規網絡那樣是預定義結構,或者僅僅是至少兩個設備
之間的自組織(adhoc)通信。
Wi-Fi,即無線保真,允許從家里沙發、酒店房間的床上或工作的會議室 連接到因特網而不需要線纜。Wi-Fi是一種類似蜂窩電話中使用的無線技術, 它使得諸如計算機等設備能夠在室內和室外,在基站范圍內的任何地方發送和 接收數據。Wi-Fi網絡使用稱為IEEE 802.11 (a、 b、 g等等)的無線電技術來 提供安全、可靠、快速的無線連接。Wi-Fi網絡可用于將計算機彼此連接、連 接到因特網以及連接到有線網絡(使用IEEE 802.3或以太網)。Wi-Fi網絡在 未許可的2.4和5 GHz無線電波段內工作,例如以11 Mbps(802.11a)或54 Mbps (802.11b)數據速率工作,或者具有包含兩個波段(雙波段)的產品,因此該 網絡可提供類似于許多辦公室中使用的基本10BaseT有線以太網的真實性能。
現在參考圖10,所示是可用于執行所公開的體系結構的示例性計算機編 譯系統的示意性框圖。系統1000包括一個或多個客戶機1002。客戶機1002 可以是硬件和/或軟件(例如,線程、進程、計算設備)。例如,客戶機1002 可以通過使用本發明來容納cookie和/或相關聯的上下文信息。
系統1000還包括一個或多個服務器1004。服務器1004也可以是硬件和/ 或軟件(例如,線程、進程、計算設備)。服務器1004可以例如通過使用本 發明來容納線程以執行變換。在客戶機1002和服務器1004之間的一種可能的 通信能夠以適合在兩個或多個計算機進程之間傳輸的數據分組的形式進行。數 據分組可包括例如cookie和/或相關聯的上下文信息。系統1000包括可以用來 使客戶機1002和服務器1004之間通信更容易的通信框架1006 (例如,諸如因 特網等全球通信網絡)。
通信可經由有線(包括光纖)和/或無線技術來促進。客戶機1002操作上 被連接到可以用來存儲對客戶機1002本地的信息(例如,cookie和/或相關聯
5的上下文信息)的一個或多個客戶機數據存儲1008。同樣地,服務器1004可 在操作上連接到可以用來存儲對服務器1004本地的信息的一個或多個服務器 數據存儲1010。
以上所描述的包括各實施例的示例。當然,出于描繪各實施例的目的而描 述組件或方法的每一個可以想到的組合是不可能的,但本領域內的普通技術人 員可以認識到,許多進一步的組合和排列都是可能的。因此,本詳細描述旨在 涵蓋所有這些落入所附權利要求書的精神和范圍內的更改、修改和變化。
特別地,對于由上述組件、設備、電路、系統等執行的各種功能,除非另 外指明,否則用于描述這些組件的術語(包括對"裝置"的引用)旨在對應于 (除非另外指明)執行所描述的執行此處在各實施例的示例性方面中所示的功 能的組件的指定功能(例如,功能上等效)的任何組件,即使這些組件在結構 上不等效于所公開的結構。在這一點上,也可認識到各實施例包括用于執行各 方法的動作和/或事件的系統以及具有用于執行這些動作和/或事件的計算機可 執行指令的計算機可讀介質。
另外,盡管可相對于若干實現中的僅一個來公開一個特定特征,但是這一 特征可以如對任何給定或特定應用所需且有利地與其它實現的一個或多個其 它特征相組合。此外,就在說明書或權利要求書中使用術語"包括"和"含有"及 其變體而言,這些術語旨在以與術語"包含"相似的方式為包含性的。
權利要求
1.一種采用查詢模式來方便表達式中的運算符之間的類型元素的類型流的計算機實現的系統,包括接收包括第一查詢子句和至少一個下一查詢子句的查詢表達式的接口,所述第一查詢子句包括第一查詢運算符、元素類型T和源類型,所述源類型是可查詢類型;以及用于所述至少一個下一查詢子句的查詢運算符模式,所述查詢運算符模式確保到所述至少一個下一查詢子句的元素類型的類型流。
2. 如權利要求1所述的系統,其特征在于,所述第一査詢運算符是笛卡 爾積形式,并且所述元素類型T是匿名類型,該匿名類型是關于所述源類型的 范圍中的全部控制變量的聚集。
3. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型S的可査詢類型的投影或 映射査詢運算符,該函數包括元素類型T的自變量。
4. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型T的可查詢類型的過濾或 限制查詢運算符,該函數包括元素類型T的自變量。
5. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型T的已排序類集的排序或 定序査詢運算符,該函數包括元素類型T的自變量。
6. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成返回具有元素類型T的可查詢類型的重復移除查詢運算符。
7. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一元素類型T為源類型的類集作為自變量,并返回具有元素類型T 的可查詢類型的集合査詢運算符。
8. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收值作為自變量并返回具有元素類型T作為源類型的可查詢類型的 選擇或過濾查詢運算符。
9. 如權利要求1所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型T的可查詢類型的條件選 擇或過濾査詢運算符,該函數包括元素類型T作為自變量。
10. 如權利要求l所述的系統,其特征在于,所述查詢運算符模式包括被配置成接收一函數作為自變量并返回數值類型的聚集查詢運算符,該函數包括元素類型T的自變量。
11. 如權利要求l所述的系統,其特征在于,所述査詢運算符模式包括被配置成接收一函數作為自變量并返回具有元素類型S的可查詢類型的聚集査 詢運算符,該函數包括元素類型T的自變量。
12. 如權利要求l所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回可被隱式地轉換成布爾值的類型的匹配 查詢運算符,該函數包括類型T的自變量。
13. 如權利要求l所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型V的可査詢類型的聯接査 詢運算符,該函數包括元素類型T的自變量以及元素類型T'的自變量,其中V 是散列值。
14. 如權利要求l所述的系統,其特征在于,所述查詢運算符模式包括被 配置成接收一函數作為自變量并返回具有元素類型V的可查詢類型的嵌套聯 接查詢運算符,該函數包括元素類型T的自變量以及具有元素類型U的類集 的自變量。
15. 如權利要求l所述的系統,其特征在于,所述查詢運算符模式包括要 接收一函數作為自變量并返回具有元素類型V的可查詢類型的分組査詢運算 符,該函數包括類型K的自變量以及具有類型T的類集的自變量,其中類型K 是關鍵字。
16. 如權利要求l所述的系統,其特征在于,還包括基于所述源類型以及 與所述至少一個下一查詢子句相關聯的查詢運算符來實時地推斷元素類型的 —匕下文組件。
17. 如權利要求16所述的系統,其特征在于,所述上下文組件基于所推 斷的類型元素來增量式地提供上下文信息。
18. —種用于方便元素類型的類型流的計算機實現的方法,包括 接收包括與査詢運算符模式相關聯的査詢運算符的査詢子句的一部分; 利用源類型和所述查詢運算符來確定元素類型;以及 采用前一查詢子句的元素類型作為用于所述利用動作的源類型。
19. 如權利要求18所述的方法,其特征在于,還包括使用所述查詢運算 符模式來增量式地提供與所述元素類型或源類型的控制變量相關聯的上下文 反饋。
20. —種用于方便元素類型的類型流的計算機實現的系統,包括 用于接收與査詢運算符模式相關聯的查詢運算符的計算機實現的裝置; 用于采用所述查詢運算符模式來確定元素類型的計算機實現的裝置;以及 用于使用前一查詢子句的元素類型作為所述査詢運算符模式的源類型的計算機實現的裝置。
全文摘要
所要求保護的主題涉及運算符模式的形式化,其可方便表達式的第一子句中的運算符到表達式的下一子句中的運算符的元素類型的類型流。流到下一子句的類型以及其中現存的運算符可被組合以推斷下一子句的元素類型。由此,可增量式地實現類型檢查、自動完成和其它有利特征而無需在前對表達式的完全轉換。
文檔編號G06F17/30GK101606154SQ200880003975
公開日2009年12月16日 申請日期2008年2月5日 優先權日2007年2月5日
發明者A·K·西爾弗, A·V·青高茲, E·扎伯克利特斯基, H·J·M·梅杰, P·A·維克 申請人:微軟公司