LightSwitch OData Tip:使用查询轻松地公开多对多关系
[原文发表地址] LightSwitch OData Tip: Easily Expose Many-to-Many Relationships using Queries
[原文发表时间] 2013-02-14 7:12 AM
那天我收到一封来自好友的电子邮件,他试图通过LightSwitch OData 服务公开多对多的关系。他试图重新创建一个类似于在https://odata.msteched.com/teau12/sessions.svc/上的 LightSwitch源。他想看到在某个给定的会话的所有演讲者的列表,但在会话和演讲者之间有一个多对多的关系。由于此源支持直接的多对多关系,我们可以使用导航属性为给定的会话提取出所有的演讲者:
https://odata.msteched.com/teau12/sessions.svc/Sessions(27981)/Speakers
因为 LightSwitch 目前不支持内部(例如ApplicationData)数据库中直接的多对多关系,我们需要以不同的方式支持这种方案。更清楚一点地说,当使用外部数据源 (如上面的源),LightSwitch将支持多对多关系,在此刻当通过数据设计器创建一个数据模型时,它只是不支持直接通过这种方式数据建模。
数据模型
好了,首先我们需要在 LightSwitch 中建立数据模型。为了构建一个多对多关系的模型,您需要一个链接表。在这里,我们有一个SpeakerSession 表,它与Speaker(演讲者)和Session(会话)都有多对一的关系。
现在如果我创建一个List & Details屏幕,然后选择Session作为屏幕数据,然后包括 SpeakerSession,LightSwitch 会自动将Speakers作为SpeakerSession 网格的下拉列表。因此,屏幕会自动处理好。(顺便说一下,如果您想要设计一个拥有多选控件的屏幕,请在这里查看Andy的文章:如何创建一个多对多关系)
但是,如果我们查看 LightSwitch 为我们创建的 OData 服务,当我们查看一个会话时,您会发现我们需要遍历SpeakerSession链接表来查找每个演讲者。
https://…/ApplicationData.svc/Sessions(1)/SpeakerSessions
所以为了获取session 1 的演讲者,我们要做两个调用。
https://…/ApplicationData.svc/SpeakerSessions(1)/Speaker
https://…/ApplicationData.svc/SpeakerSessions(5)/Speaker
相反,我们只想要做1个调用来获取给定会话的所有演讲者。
创建一个查询
诀窍是创建一个查询。查询也被公开在您的 OData 服务端点上。例如,我们打开查询设计器,并创建一个基于Speakers实体、称为 SpeakersBySession的查询。为 SessionID 添加一个参数。
现在下拉Write Code按钮,然后添加代码到 SpeakersBySession_PreprocessQuery 方法中。我们需要编写 一个LINQ 查询,它将检查Session ID ,并只返回相匹配的演讲者。
Private Sub SpeakersBySession_PreprocessQuery(SessionID As System.Nullable(Of Integer),
ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Speaker))
'Return the speakers that have sessions matching the passed in Session ID
query = From speaker In query
Where speaker.SpeakerSessions.Any(Function(s) s.Session.Id = SessionID)
Select speaker
End Sub
顺便说一下,在 C# 中的 LINQ 语句将会是:
query = from speaker in query
where speaker.SpeakerSessions.Any(s => s.Session.Id == SessionID)
select speaker;
运行它 !
现在我们可以直接通过该服务调用查询,它将返回给定会话的演讲者名单。
<https://…/ApplicationData.svc/SpeakersBySession?SessionID=1>
当然,您可以以这种方式公开任何您想要的简单或复杂的查询,而不只是多对多关系。通过在查询设计器中使用访问控制挂钩,您还可以限制谁可以执行查询。
有关Visual Studio 2012 中 OData & LightSwitch的更多信息,请参阅:
有关查询的更多信息,请参阅:
有关编写 LINQ 查询的更多信息,请参阅:
希望大家喜欢 !