BreezeJS executeQueryLocally并返回字符串

时间:2014-05-20 13:39:22

标签: breeze

我可以在微风中从服务器执行查询(使用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);

这会返回[]

我做错了什么?

1 个答案:

答案 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);