我可以在微风中从服务器执行查询(使用EF),这会返回一堆boostrap数据:
em.executeQuery(_lookupsQuery).then(function (data) {
_lookups = data.results;
console.log(_lookups[0].currentUserId);
这将返回currentUserId,这是一个guid。然后我使用本地存储来存储em以便稍后在本地查询:
_lookups = [{
currentUserId: em.executeQueryLocally(_lookupsQuery.toType(breeze.DataType.String))
}];
然而,这不起作用,因为它需要一个实体类型,例如: em.executeQueryLocally(_lookupsQuery.toType(em.metadataStore.getEntityType("测量")))
由于currentUserId是一个guid,我不确定将查询转换为哪种类型。我试图在客户端上创建一个实体类型,但它似乎不起作用。任何有关解决此问题的帮助都将受到赞赏。
编辑:
在提出建议后,我修改了查找:
[HttpGet]
public async Task<object> Lookups()
{
var currentUser = await UserManager.FindById(Guid.Parse(User.Identity.GetUserId()));
var companyId = currentUser.CompanyId.Value;
return new
{
currentUser = new
{
Id = currentUser.Id
}
};
}
使用以下方式远程查询时:
em.executeQuery(_lookupsQuery).then(function (data) {
_lookups = data.results;
console.log(_lookups[0].currentUser);
我明白了:
对象{id =&#34; f2dceb4b-29e7-4533-99e2-2052dc39143a&#34;}
我设置了新的实体类型:
metadataStore.addEntityType({
shortName: "CurrentUser",
dataProperties: {
id: { dataType: "String", isPartOfKey: true }
}
});
但是当我在本地查询时:
_lookups = [{
currentUser: em.executeQueryLocally(_lookupsQuery.toType(em.metadataStore.getEntityType("CurrentUser"))) }];
console.log(_lookups[0].currentUser);
这会返回[]
我做错了什么?
答案 0 :(得分:0)
有几种方法可以处理它。我只会谈谈我个人使用的两种最基本的方法,希望能激发你的兴趣。
<强> -1。在您的metadataStore中创建一个entityType用于用户类型信息。
metadataStore.addEntityType({
shortName: "User",
dataProperties: {
userId: { dataType: "String", isPartOfKey: true },
userName: { dataType: "String" }
}
});
这将添加一个可以将返回结果序列化的实体类型。这里需要注意的是,如果您在不接受本地更改的情况下更改该用户的任何内容,则会在您下次调用saveChanges()
时尝试保存该内容,因此请确保在适用的情况下处理这些情况。
当然,这不是唯一的选择。您肯定可以从查询结果中获取该用户ID,而Breeze不知道它或它的用途。
<强> -2。 POJO 强>
function user(data) {
var self = this;
self.UserId = data.userId;
self.UserName = data.userName;
}
// After your query returns data
query.execute().then(userReturned);
function userReturned(data) {
// data is the returned object, which contains
// an httpResponse which is what breeze returns
// as the raw response
new user(data.httpResponse.data);
}
这个方法基本上只是在promise返回时抓取httpResponse并使用它来创建一个没有Breeze知道它的Plain Old JavaScript Object。当然,为了使其工作,您需要检查返回的数据对象并找到您要查找的内容并将其序列化。
修改强>
您在本地的查询应如下所示 -
query = breeze.entityQuery().from("Whatever").toType("CurrentUser").executeLocally();
em.executeQueryLocally(query);