在 lightswitch html5 客户端中的 1:n 关系中设置默认值时最小化服务器行程

Minimizing server trips in setting default value in 1:n relationship in lightswitch html5 client

我在 HTML5 客户端中创建了 lightswitch 实体。有一个用户不应设置的字段需要根据他们的登录设置。在这种情况下,用户关联的客户端。

标准示例(在 Michael Washington 的书中创建 HTML 5 个网站......使用 Lightswitch 和整个网络)涉及将用户名分配为相关字段,在服务器上设置一个小处理程序使用 AJAX 调用 return 相关字段。

这在制作原型时一切都很好,但现在我们真正这样做了,与涉及的另一个实体(客户端实体)有关系,所以您不能只分配客户端 ID。因此,我们不是简单地分配一个客户端 ID,而是将整个客户端对象关联到实体。

Here 建议是做最终看起来像这样的事情:

myapp.activeDataWorkspace.ApplicationData.Clients_SingleOrDefault(1).execute().then(function (ClientQuery) {
    entity.setClient(ClientQuery.results[0]);
});

我的问题出在这部分:

Clients_SingleOrDefault(1)

我需要动态获取该数字,而不是像 OP 所建议的那样只是硬编码的 1。所以我可以在两次服务器调用中完成,一次获取 ID,然后下一次将该结果代入下一次调用,但这似乎……效率低下。

msls.promiseOperation(CallGetClientId).then(function PromiseSuccess(PromiseResult) {
    myapp.activeDataWorkspace.ApplicationData.Clients_SingleOrDefault(Number(PromiseResult)).execute().then(function (ClientQuery) {
        entity.setClient(ClientQuery.results[0]);
    });
});

function CallGetClientId(operation) {
    $.ajax({
        type: 'post',
        data: {},
        url: '../UserCode/GetClientId.ashx',
        success: operation.code(function AjaxSuccess(AjaxResult) {
            operation.complete(AjaxResult);
        })
    });
}

看来应该有更好的办法。有吗?

通过一次服务器调用实现此目的的最简单方法是实现标量查询。

例如,如果您针对您的客户创建一个名为 ClientForCurrentUser 的标量查询 table,您将能够按如下方式进行单个客户端调用:

myapp.activeDataWorkspace.ApplicationData.ClientForCurrentUser().execute().then(function (query) {
    if (query && query.results && query.results.length !== 0) {
        entity.setClient(query.results[0]);
    }
});

关于配置标量查询,下面post举例说明(注意'Number of Results Returned'属性的设置):

然后,假设您的客户记录有一个字段将其与当前用户名相关联(例如 Client.RelatedUser),您将针对标量查询实施以下类型的 PreprocessQuery 方法:

partial void ClientForCurrentUserPersonForCurrentUser_PreprocessQuery(ref IQueryable<Client> query)
{
    var username = this.Application.User.Name;
    query = query.Where(c => c.RelatedUser.Equals(username, StringComparison.OrdinalIgnoreCase)).Take(1);
}