在 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);
}
我在 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);
}