LightSwitch入门第四部分:信息量太多!使用Query来排序和过滤
[原文发表时间] 2013-11-27 11:12 PM
注:这是Visual Studio 2013更新的非常受欢迎的LightSwitch入门文章系列,关于以前的版本,请参见:
- Visual Studio 2012: Part 4: Too much information! Sorting and Filtering Data with Queries
- Visual Studio 2010: Part 4: Too much information! Sorting and Filtering Data with Queries
欢迎来到Visual Studio 2013的LightSwitch系列课程第三部分!在第1,2和3部分中我们学习了Visual Studio中的实体,联系和界面。如果你错过了,请参见:
- Part 1: What’s in a Table? Describing Your Data
- Part 2: Feel the Love - Defining Data Relationships
- Part 3: Screen Templates, Which One Do I Choose?
在这篇博客中,我们要讨论查询。在现实生活中Query只是一个问题。但是当我们在数据库上下文环境中讨论查询,我们指的是一种从我们的数据库中请求特定的数据子集的查询语言。你可以使用查询来帮助用户找到他们正在寻找的信息,并将精力集中在手中任务所需要的数据上。随着数据的增长,为了让你的程序为用户更富有成效,查询变得十分必要。而不是在一个页面上为了你想要的信息查询整张数据库表。你可以使用查询将结果缩小到一个可管理的列表。例如,如果你想知道多少个联系人居住在加利福利亚,你创建一个Query来监视一个联系人列表,以及检查这些联系人的所在的州。
如果你遵循这一文章系列,其实你已经知道了如何在LightSwitch中如何使用查询。在第三部分中,我们建立了一个为浏览联系人的页面的指定的搜索,这允许用户通过Frist Name或者Last Name来查找联系人,在这篇文章中我想为你展示如何使用Query设计器定义你自己的可重用性的Queries以及你如何在应用程序中使用它们。
LightSwitch 查询设计器
查询设计器可帮助您构建查询,以发送请求到后端数据源获取你想要的实体。您可以使用设计器来创建过滤条件,并指定排序选项。在LightSwitch中,查询是基于在数据模型中的实体(例如,联系人实体)。查询还可以基于其他的查询,使查询能够轻松建成。例如,如果你定义了一个名为SortedContacts查询,联系人排序按自己的姓氏属性,你就可以使用这个查询的返回联系人作为其他查询的数据源。这样就避免了重复应用过滤和/或排序条件在您可能需要的每一个查询条件上。
关于查询设计器的参考,请参阅:查询:从数据源检索信息
有关如何使用查询设计器的视频演示,请参阅: 我如何:在使用LightSwitch HTML客户端界面上筛选数据?
创建一个“SortedContracts”查询
让我们通过使用我们曾经创建过的联系人管理地址簿应用程序,来演练LightSwitch中查询的一些具体例子。在第三部分中,我们建立了一个联系人的查询界面,该联系人查询是以名字和姓氏来排序。然而,这个查询是特定于浏览联系人界面。如果我们想在我们的应用程序中的其他部分的查询重用,而不是直接在屏幕上修改查询?这样的话你可以使用查询设计器来定义全局查询,并将其关联到你的实体。
要创建一个全局查询,在解决方案资源管理器中,右键单击你想要基于其上的(在我们的案例电话簿)的实体,然后选择“添加
查询”。
查询设计器将打开,你做的第一件事是命名您的查询。我们将其命名为我们的“SortedContacts”。一旦你这样做,你会在解决方案资源管理器中的实体列表中看到此查询。
接下来,我们需要定义查询的排列顺序,点击“ 添加排序”,然后在设计器的排序区域,从下拉列表中选择FirstName属性。再次点击“ 添加排序”,这一次选择LastName属性。让两个排序保持默认的递增排列。
现在我们有了这个查询来对我们的联系人实体进行排序,我们可以用它作为其他联系查询的基础,这样如果我们想改变排序顺序,所有基于此查询的查询都将更新排序。举例来说,现在我们可以创建基于SortedContacts的一个应用滤镜条件查询。
但在我们先进入过滤条件和参数区域之前,需要注意当选择浏览数据界面的时候,SortedContacts是作为界面数据的一个选项显示。全局查询显示是这样显示的。
请记住,你不会看到查询针对界面模板返回的数据集,并以独立的记录进行工作,像视图,添加/编辑详情界面模板一样。
定义过滤条件和参数
如果我们想允许用户查找联系人以他的出生日期落在一个特定的范围内?让我们来创建一个过滤器,按日期范围查询联系人,但这次我们将指定查询的数据来源是SortedContacts查询。在联系人实体右键单击并选择“添加查询” ,再次打开查询设计器。命名查询“ ContactsByBirthDate ”,然后在查询设计器右上角上的数据源下拉列表中选择“SortedContacts”。
现在这个查询已经进行过排序,但我们需要添加一个过滤条件。定义过滤条件可以进行一些实践(比如设计一个好的数据模型),但LightSwitch中在保持其的强大性的同时,试图使其操作尽可能的简单。您可以在过滤器中指定相当复杂的条件和分组,但我们需要定义的这个并不是太复杂。当你需要查找某个范围内的记录,您将需要定义2个条件。一旦检查记录属于“大于”来检查记录的最低值和一个属于“小于”来检查记录的最大值。
所以在查询设计器,点击“添加过滤器”并像这样指定条件:
当
BirthDate 属性
大于或等于
一个参数。
然后选择“新增”来添加一个新的参数。
参数的默认名字为“BirthDate”,在参数区域中把它更改为“MinimumBirthDate”。
同样,添加一个“叫住MaximumBirthDate的新参数,使BirithDate属性小于或等于它”的筛选条件。查询设计器现在看起来应该像这样:
我们要思考对于参数的最后一件事是他们是否应该必需的与否。这意味着用户是否必须填写的筛选条件参数,以用于执行查询?在这种情况下,我不想强迫用户输入其中任何一个条件,所以我们将其定义为可选的。通过选择参数,并在属性窗口中的标记“是可选的”。
好的,现在让我们为浏览联系人界面使用这个查询。而不是创建一个新的界面,并选择这个全局性的查询,我们可以改变我们在第3部分中创建的联系人浏览界面上当前使用的查询。打开这个界面,选择左侧的联系人查询,然后将数据源更改为通过生日来获取联系人的查询。LightSwitch只会让我们选择返回联系人的查询,或联系人实体本身。
一旦我们这样做,你会看到,我们需要的参数已经自动添加到界面的视图模型,并绑定到新的查询参数(以灰色箭头表示)。从视图模型中删除先前的界面参数(FindContact),将新的参数拽到界面上您想要出现的位置,然后更改控件为日期选择器控件。我还添加了出生日期字段插入表,改变了List控件为平铺列表。
按F5键生成并运行该应用程序。请注意,在联系人浏览界面上联系人按字母顺序排序,但你会看到在页面的顶部的区域,让我们指定出生日期范围。由于这两个参数是可选的,用户可以什么都不用输入,或者输入一个,或者同时输入两个日期,查询会基于这些标准自动正确的被执行。
快速提示的较小外形列表(或者你有很多可选参数)。 如果你的大部分用户使用如手机一样小型设备,你可能想节约在屏幕上宝贵的空间。或者,也许你想要一单独的界面来显示,如果你有很多的可选参数。不是把参数字段放在联系人的列表上方,而是我们可以把它们放在弹出的窗口里面。当应用程序在调试状态运行,翻转界面设计器。通过过点击弹出窗口的节点来添加一个弹出窗口,在属性窗口中将其命名为“Filter”,然后把参数拽进去。
然后添加一个按钮到命令栏,以显示弹出窗口(这将被自动选择,所以只需单击添加按钮对话框的OK就可以了)。
您还可以使用属性窗口中的过滤器图标来作为新增加的“显示过滤器”按钮图标。当您在界面上完成适当的调整,保存您的所有文件,然后刷新浏览器。现在您将在命令栏上看到一个过滤联系人的按钮。(另请注意,并列列表将显示为正常的较小外形列表。)
正如你可以看到的那样,使用参数查询,您可以执行特殊的搜索。当创建新的基于界面数据的界面的查询,LightSwitch中会自动寻找在查询的参数,并建立相应的界面参数和控件。如果你改变现有的界面查询,LightSwitch中会在您的视图模型上创建一个绑定到查询参数的相应的界面参数。无论哪种方式,你可以使用界面设计器准确的按照你想显示给用户的那样显示。
查询相关实体
在我们开始讨论这个之前,我想谈谈更多类型的查询。假使我们希望允许用户通过电话号码来搜索联系人该怎么办?如果你还记得我们建模好的数据,就应该知道一个联系人可以有很多电话号码,且电话号码存储在一个单独的相关表中。为了使用查询设计器来查询这些,我们必须使我们的查询基于PhoneNumber实体,而不是联系人。
因此,在解决方案资源管理器中PhoneNumbers实体右键单击,并选择“添加查询”。我将它命名为ContactsByPhone 。除了按照PhoneNumber搜索以外,我也想允许用户按照联系人的姓氏和名字来搜索联系人。这其实是很容易做到的,因为在查询设计器将允许您创建过滤条件在父表上,这里父表是联系人实体。当您选择属性时,你可以展开联系人节点,获得所有的联系人属性。
所以在查询设计器上,点击“添加过滤”并像这样指定条件:
当联系人的姓氏属性
包含
一个参数
然后选择“新增”来添加新的参数。
该参数的名称将默认为“LastName”,因此在下方的参数区域将其更改为FindContact,并在属性窗口中使其可选择属性为“是可选的”。
我们将使用相同的参数应用到我们的余下的所有条件。这将允许用户在一个文本框中输入自己的搜索条件,查询将在所有三个字段搜索匹配项。所以接下来的筛选条件是:
选择 ‘或’ 属性。联系人的名字属性包含FindContact的参数
接下来添加最后一个过滤条件:
选择‘或’电话属性 包含 FindContact的参数。我还添加了Contact.FirstName排序,然后是Contact.LastName排序,最后是电话递增排序。查询设计器现在看起来应该像这样:
现在是时候为此查询创建一个浏览界面。而不是删除其他的浏览界面,如通过出生日期范围内过滤的浏览界面,我要为此查询创建另一个新的界面。另一种选择是将上一个日期范围条件添加到该查询中,这将创造一个更复杂的查询,但将允许我们只要一个搜索界面。对于这个例子,让我们保持它的简单,但这里有一个暗示,你该如何使用一组构造查询:
不仅是支持复杂的分组选项,但你也可以点击设计器的顶部的下拉列表中的“编写代码”按钮,使用LINQ编写自己的查询。有关编写更多复杂的查询的信息,请参阅: 查询:从数据源中检索信息 ,以及如何创建组合和标量查询。
接着添加新的浏览界面,再次在界面节点上单击鼠标右键,选择“添加界面...”,打开添加新界面对话框。选择浏览数据界面模板和界面数据选择ContactsByPhone查询,然后单击确定。
接着为了使屏幕看起来如我们想要的那样。我会将列表视图改为方格视图,并且只保留联系人,电话和电话类型。更改联系人控件至列布局和删除除名字和姓氏的所有字段。我还将手机类型的字体样式在属性窗口修改使其变小。然后在“PhoneNumerFindContact”界面参数更改为一个文本框,并设置标签位置为无 ,然后输入占位符文本“查找联系人”。屏幕看现在起来应该像这样:
接下来让我们来接上我们的检索行为和添加按钮,这样我们就可以添加新的联系人,并从这个界面查看现有联系人。选择命令栏,添加一个按钮并选择现有的方法showAddEditContact,并设置联系人为(新建联系人)。单击OK。
更改按钮名称为“添加联系人”,并使用属性窗口设置为图标“添加”。下一步选择并列列表和设置点击行为,在属性窗口。选择现有的方法showViewContact,然后设置联系人实体到ContactsByPhone.selectedItem.Contact。单击OK。
最后,在解决方案资源管理器中的界面节点上点击击鼠标右键,选择“编辑界面导航”。现在我们可以在我们的应用程序中选择两个界面,添加到到全局导航栏上。有关界面导航的更多详情,请参见: LightSwitch HTML客户端新的导航功能。
您也可以在解决方案资源管理器中此界面点击鼠标右键,将其设置为主页界面,这样这个界面会最先打开。
好的,按F5,让我们看看会发生什么。现在,用户可以按姓名或电话号码搜索联系人。当你点击联系人列表,我们在第3部分创建的查看详细信息界面将自动打开。
小结
正如你所看到的那样,查询帮助我们将大量数据缩小到用户完成某项任务所需要的信息。LightSwitch中提供了一个简单,易于使用的查询设计器,可以让你的查询基于实体以及其他查询。并且LightSwitch界面设计器,在当你的界面基于使用参数的查询时为你做了所有繁重的任务。
编写良好的查询需要练习,所以我鼓励你,通过在LightSwitch开发人员中心的查询部分所提供的资源进行工作。
在接下来的文章中,我们将着眼于用户的权限。后会有期!
享受!
阅读下一篇文章 - 》 第五部分:我可以?控制用户访问权限