天天看點

開始VS 2012中LightSwitch系列的第4部分:太多資訊了!使用查詢來排序和篩選資料

[原文發表時間]  2012-08-15 18:03

<a href="http://blogs.msdn.com/b/beth_massi/archive/2012/08/20/vs-2012-lightswitch.aspx">第 1 部分: 表中有什麼?描述你的資料</a>

<a href="http://blogs.msdn.com/b/beth_massi/archive/2012/08/20/vs-2012-lightswitch-2.aspx">第 2 部分: 感受到關愛,定義資料關系</a>

<a href="http://blogs.msdn.com/b/beth_massi/archive/2012/08/20/vs-2012-lightswitch-3.aspx">第 3 部分:我該選擇哪一個螢幕模闆?</a>

在這篇文章中,我想談一談查詢。在現實生活中,查詢隻是一個問題。但是,當我們談論資料庫中的查詢時,我們指的是用于從資料庫中請求資料的特定子集的查詢語言。你可以使用查詢來幫助使用者找到他們要找的資訊,使他們專注于手頭任務所需的資料。随着資料的增長,查詢變得十分必要,它可以提高你的應用程式效率。并不是某個時刻在整個表中搜尋你想要的資訊,而是你使用查詢将結果縮小到一個易于管理的清單中。例如,如果你想知道有多少聯系人居住在加利福尼亞州,你可以建立一個查詢來檢視聯系人清單,并檢查他們位址所在的州。

如果你在關注這一系列文章,你其實已經知道了如何在 LightSwitch 中執行查詢。在第 3 部分中,我們建立了一個Search Data螢幕。此螢幕有内置搜尋功能,允許使用者鍵入搜尋項,并傳回任何字元串字段與這個詞相比對的行。在這篇博文中,我想向你們展示如何使用查詢設計器來定義你自己的查詢,以及如何在螢幕上使用它們。

LightSwitch 查詢設計器

查詢設計器将幫助你建構查詢,并發送到後端資料源中檢索你想要的實體。你可以使用設計器來建立篩選條件,并指定排序選項。LightSwitch中的查詢基于你的資料模型中的實體(例如,聯系人實體)。此外查詢也可以基于其他查詢,這樣它們就可以很容易地組合。例如,如果你定義一個稱為SortedContacts的查詢,通過他們的姓氏屬性來對聯系人進行排序,你也可以将此查詢作為其他查詢的源來傳回聯系人。這避免了重複篩選和/或排序那些你可能想應用于每個查詢的條件。

建立一個"SortedContacts"查詢

讓我們使用我們一直建構的聯系人管理器通訊簿應用程式作為具體的例子來講述在LightSwitch中建立查詢。在第 3 部分中我們為聯系人建立了Search Data螢幕,但是你會注意到最初顯示螢幕時,聯系人是沒有排序的。使用者必須手動單擊所需的網格列來排序。一旦使用者更改了排序順序 ,LightSwitch 會記得對每個使用者的基礎,但當Search螢幕第一次顯示時,我們真的應該為聯系人進行排序。

若要建立一個查詢,在解決方案資料總管中,右擊你想要基于(在我們的案例聯系人) 的實體,并選擇“Add Query”。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4265.image_5F00_0D7F320D.png"></a>

查詢設計器将會打開,你要做的第一件事是給你的查詢命名。我們将命名為"SortedContacts"。一旦你這樣做了,你将在解決方案資料總管中的實體下面看到該查詢。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/5751.image_5F00_40DAF569.png"></a>

接下來,我們需要定義排序順序,單擊設計器排序部分中的“+Add Sort”,然後從下拉清單中選擇LastName屬性。再次單擊“+Add Sort”,這次選擇FirstName屬性。以升序的順序對這兩個屬性進行排列。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/5751.image_5F00_38772012.png"></a>

在我們進入篩選器條件和參數之前,先讓我們看看在Search 螢幕中如何使用此簡單的查詢。在這個案例中,重新建立我們在第 3 部分建立過的Search螢幕變得很容易,因為我們對布局并沒有進行任何修改。是以在解決方案資料總管中選擇 SearchContacts 螢幕,然後删除它。然後右鍵單擊Screens節點并選擇“Add Screen(添加螢幕)…”以打開添加新螢幕對話框。

為螢幕資料選擇Search Data螢幕模闆,然後你将會看到 SortedCOntacts 查詢。選擇它,然後單擊OK。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/8078.image_5F00_10D0A3E8.png"></a>

按F5來建構并運作應用程式,并注意這次聯系人立即按字母順序進行排序了。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4846.image_5F00_365A2149.png"></a>

定義篩選器條件和參數

我們的查詢螢幕現在建好了,但是如果我們想要允許使用者查找出生日期在特定範圍内的聯系人,那該怎麼辦呢?在框外,LightSwitch 會自動搜尋整個實體中的所有字元串屬性而不是日期。是以,為了讓使用者能夠在出生日期範圍内搜尋,我們需要定義自己的查詢。

現在,讓我們建立一個查詢來篩選日期範圍,但這一次我們将指定查詢源為 SortedContacts 查詢。右鍵單擊聯系人實體,然後選擇“Add Query(添加查詢)”來再次打開查詢設計器。将此查詢命名為"ContactsByBirthDate",然後在設計器右上角Source下拉菜單中選擇"SortedContacts"。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/6318.image_5F00_23A52792.png"></a>

現在查詢已經排序了,但是我們需要添加一個篩選器條件。定義篩選器條件需要一些練習(就像設計優秀的資料模型),但 LightSwitch 試圖讓它在功能強大的同時,也盡可能容易操作。你可以在你的篩選器中指定相當複雜的條件和分組,但是我們需要定義的并不是很複雜。當你需要在某個值的範圍内查找記錄時,你将需要 2 個條件。一個是檢視落在最小值"上面"的記錄和一個是檢視落在最大值“下面”之間的記錄。

是以在查詢設計器中,單擊“+ Add Filter (添加篩選器)”,并指定如下所示條件:

Where

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/3782.image_5F00_1C19B825.png"></a>

BirthDate屬性

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7573.image_5F00_537FC953.png"></a>

大于或等于

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4278.image_5F00_44D51D6E.png"></a>

參數.

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/1145.image_5F00_600D766F.png"></a>

然後選擇“Add New(添加新的)”來添加新的參數。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/8407.image_5F00_1F6B2A00.png"></a>

參數的名稱将預設為“BirthDate”,是以在參數部分将它改為MinimumBirthDate。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/2703.image_5F00_5EC8DD90.png"></a>

同樣地,添加篩選器條件," BirthDate屬性小于或等于稱為MaximumBirthDate的新參數"。現在查詢設計器應該如下所示:

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/3276.image_5F00_2230DEF3.png"></a>

對于參數,我們要思考的最後一件事是它們是否是必需的。這意味着使用者是否必須填寫篩選條件參數以執行該查詢。在這個案例中,我不想強制使用者輸入任意參數,是以我們将它們設為可選的。你可以通過在屬性視窗中選擇參數并勾選“Is Optional”來做到這點。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/1122.image_5F00_35719592.png"></a>

好的,現在讓我們在Search螢幕上使用此查詢。在解決方案資料總管中選擇 SearchSortedContacts 螢幕,并将其删除。然後右鍵單擊Screens節點,并選擇“添加螢幕…”來再次打開添加新螢幕對話框"。選擇Search Data螢幕模闆和為螢幕資料選擇 ContactsByBirthDate 查詢并單擊OK。

按下F5來生成并運作該應用程式。請注意在我們的search螢幕上聯系人仍按字母順序排序,但你會在螢幕頂部看到額外字段,它可以讓我們指定出生日期範圍。LightSwitch 會識别我們的查詢所指定的參數,是以當我們把它作為螢幕基礎時,正确的控件将會為我們自動生成!因為這些參數都是可選的,是以使用者可以輸入空值,一個,或兩個日期,查詢将基于該條件自動執行。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7485.image_5F00_2D0DC03B.png"></a>

正如你看到的,使用像這樣的查詢參數可以讓你執行更多指定的搜尋,而不是隻使用預設情況提供的。當将查詢用作螢幕資料的基礎時,LightSwitch 會自動着眼于查詢的參數并建立相應的螢幕參數和控件,那樣可以為你節省時間。

查詢相關的實體

在我們總結之前,我想談談更多類型的查詢。如果我們想要允許使用者通過電話号碼搜尋聯系人,那該怎麼辦呢?如果你回憶起我們的資料模組化,那兒聯系人可以有很多的電話号碼,是以它們存儲在一個單獨的相關表中。為了查詢這些,我們需要查詢基于PhoneNumber實體,而不是Contact。

是以右擊解決方案資料總管中的PhoneNumbers實體并選擇“添加查詢”。我将它命名為 ContactsByPhone。除了搜尋電話号碼之外,我也想要允許使用者搜尋聯系人的姓氏和名字。這很容易做到,因為查詢設計器将允許你建立在相關的父表中篩選的條件,在本例中為Contact表。當你選擇其屬性時,你可以展開Contact節點然後擷取所有的屬性。

是以在查詢設計器中,單擊“+ 添加篩選器”,并指定如下所示條件:

Where the Contact’s LastName property

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/2318.image_5F00_335496C9.png"></a>

包含

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/6011.image_5F00_0BAE1A9F.png"></a>

參數

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/1538.image_5F00_5C7C2F07.png"></a>

然後選擇“添加新的”來添加新的參數。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4278.image_5F00_6256D2A0.png"></a>

參數的名稱将會預設為“LastName”,是以在參數部分中将其更改為SearchTerm,并通過在屬性視窗中選中“Is Optional” 将其設為可選的。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/6835.image_5F00_3AB05676.png"></a>

我們将為其餘的條件使用相同的參數。這允許使用者在一個文本框中鍵入他們的搜尋條件,查詢将搜尋所有與這三個字段相比對的結果。是以,下一個篩選條件為:

Or the Contact’s FirstName property contains the parameter of SearchTerm

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/6320.image_5F00_2EAE6642.png"></a>

最後,添加最後的篩選條件:

Or the Phone property contains the parameter of SearchTerm。我還會添加一個電話号碼升序排序。現在查詢設計器應該如下所示:

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/0243.image_5F00_34F53CD0.png"></a>

現在是時候來為此查詢建立一個Search螢幕了。并不是要删除其他按出生日期範圍篩選的Search螢幕,而是我要為此查詢去建立另一個新的Search螢幕。另一個選擇是将之前的日期範圍條件添加到此查詢中,它将建立一個更複雜的查詢,但會讓我們有一個可以做所有事情的Search螢幕。在此例中,我們簡單一點,但這兒是一個關于如何通過使用組來建構查詢的提示:

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7080.image_5F00_5437E3A3.png"></a>

是以為了添加新的Search螢幕,就再次右鍵單擊Screens節點,并選擇“添加螢幕…”來打開添加新螢幕對話框。選擇Search Data螢幕模闆,并且這一次為螢幕資料選擇 ContactsByPhone 查詢,單擊OK。

現在在我們運作它之前,我想對螢幕做一個小的更改。Search螢幕的預設行為是将第一列做為連結,以此來打開該記錄的Details螢幕。因為我們不得不将我們的查詢基于PhoneNumber實體,LightSwitch 将Phone屬性做為連結,而不是Contact。是以在螢幕設計器中,我們需要做一個小的更改。在内容目錄中選擇Phone,并在屬性視窗中取消選中“顯示為連結”。然後選擇Contact,并勾選“顯示為連結” 。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7870.image_5F00_0C765ABC.png"></a>

在屬性視窗中也更改一下顯示名稱,将PhoneNumberSearchTerm文本框改為“Phone Number or Name”來讓使用者更明确他們所要篩選的。當我們使用它時,我們應該選擇左側的 ContactsByPhone 查詢,然後取消選中屬性視窗中的“支援查詢”來禁用預設的搜尋框。這不是必要的,因為我們自己的查詢可以提供更多的搜尋功能。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4834.image_5F00_326C0B12.png"></a>

好的,按下F5 鍵,讓我們看看我們擷取了什麼。從導航菜單中打開“Search Contact By Phone” Search螢幕,現在使用者可以按名稱或電話号碼搜尋聯系人。當你點選某個聯系人的連結時,我們在第 3 部分中建立的Details螢幕将會自動打開。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/8156.image_5F00_5C6C093A.png"></a>

總結

正如你看到的,查詢幫助将資料量縮小到了使用者完成任務所需的資訊。LightSwitch 提供了一個簡單、 易于使用的查詢設計器,它讓你可以将查詢基于實體和其他的查詢。而且當你将螢幕基于使用參數的查詢時,LightSwitch 螢幕設計器為你完成所有這些繁重的任務。

在下一篇博文中,我們将談論使用者權限,你将看到如何編寫你的第一行LightSwitch代碼!下一次再見 !

希望大家喜歡 !