Udostępnij za pośrednictwem


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(会话)都有多对一的关系。

image

现在如果我创建一个List & Details屏幕,然后选择Session作为屏幕数据,然后包括 SpeakerSession,LightSwitch 会自动将Speakers作为SpeakerSession 网格的下拉列表。因此,屏幕会自动处理好。(顺便说一下,如果您想要设计一个拥有多选控件的屏幕,请在这里查看Andy的文章:如何创建一个多对多关系)

但是,如果我们查看 LightSwitch 为我们创建的 OData 服务,当我们查看一个会话时,您会发现我们需要遍历SpeakerSession链接表来查找每个演讲者。

https://…/ApplicationData.svc/Sessions(1)/SpeakerSessions

image

所以为了获取session 1 的演讲者,我们要做两个调用。

https://…/ApplicationData.svc/SpeakerSessions(1)/Speaker
https://…/ApplicationData.svc/SpeakerSessions(5)/Speaker

相反,我们只想要做1个调用来获取给定会话的所有演讲者。

创建一个查询

诀窍是创建一个查询。查询也被公开在您的 OData 服务端点上。例如,我们打开查询设计器,并创建一个基于Speakers实体、称为 SpeakersBySession的查询。为 SessionID 添加一个参数。

image

现在下拉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>

image

当然,您可以以这种方式公开任何您想要的简单或复杂的查询,而不只是多对多关系。通过在查询设计器中使用访问控制挂钩,您还可以限制谁可以执行查询。

有关Visual Studio 2012 中 OData & LightSwitch的更多信息,请参阅:

有关查询的更多信息,请参阅:

有关编写 LINQ 查询的更多信息,请参阅:

希望大家喜欢 !