Breeze.js - 无法在entityType上解析表达式:1367380800000:顺序:#Zza.Data

时间:2014-12-09 06:31:59

标签: javascript entity-framework breeze

我正在Building Data-Centric Single Page Apps with Breeze关注Pluralsight的课程。这里的代码使用的是Breeze的1.4.2版本,并且运行在Web API v1和EF 5上。我将解决方案升级到EF 6,Web API v2和Breeze v1.5.1并取得了一些成功。我能够启动并运行基本查询以及运行简单谓词,如下所示:

var productsWithBacon = function () {
    var query = breeze.EntityQuery.from("Products").where("Description", "contains", "bacon");
    app.em.executeQuery(query)
    .then(function (data) {
        products(data.results);
    })
    .fail(errorLoading);
};

当我尝试执行此处所示的复杂谓词时会出现问题。

var ordersGreaterThan100InMay = function () {
    clearCollections();
    var gteMay1 = new breeze.Predicate("OrderDate", ">=", moment("2013-05-01"));
    var lteMay31 = new breeze.Predicate("OrderDate", "<=", moment("2013-05-31"));
    var gt100 = new breeze.Predicate("ItemsTotal", ">=", 100);
    var predicate = breeze.Predicate.and(gteMay1, lteMay31, gt100);
    var query = breeze.EntityQuery.from("Orders").where(predicate).expand("Customer");
    app.em.executeQuery(query)
        .then(function (data) {
            orders(data.results);
        })
        .fail(errorLoading);
};

执行时,我收到标题

中显示的错误
Unable to resolve an expression for: 1367380800000 on entityType: Order:#Zza.Data

最初,代码(如课程中所述)使用如下行:

var gt100 = new breeze.Predicate("ItemsTotal", "greaterThanOrEqual", 100);

这导致错误:

Uncaught Error: Unable to resolve predicate after the phrase: 'ItemsTotal' for operator: 'greaterThanOrEqual'  and value: '100'

但通过更改为&#34;&gt; =&#34;。

解决了这个问题

是什么导致表达式错误?

3 个答案:

答案 0 :(得分:0)

上述帖子中的评论者是正确的。

显然,Moment.js的更新(课程的原始版本为2.2.1)到最新版本(撰写本文时为2.8.2)可能已经改变了一些东西。我不知道是不是当时没有返回实际日期对象或Breeze中的某些内容发生了变化,但以下代码确实有效。

var ordersGreaterThan100InMay = function () {
    clearCollections();
    var gteMay1 = breeze.Predicate.create("OrderDate", ">=", moment("2013-05-01").toDate());
    var lteMay31 = breeze.Predicate.create("OrderDate", "<=", moment("2013-05-31").toDate());
    var gt100 = breeze.Predicate.create("ItemsTotal", ">=", 100);
    var predicate = breeze.Predicate.and(gteMay1, lteMay31, gt100);
    var query = breeze.EntityQuery.from("Orders").where(predicate);
    app.em.executeQuery(query)
        .then(function (data) {
            orders(data.results);
        })
        .fail(errorLoading);
};

答案 1 :(得分:0)

我为你展示的代码感到困惑。我明白这一点,在“Breeze Query Basics: Demo: Complex Filter Criteria”剪辑的1'04“标记处。

据我所知“greaterThanOrEqual”从未成为受支持的谓词比较运算符。我只是在github上搜索了微风的历史,尽我所能,我找不到它。

同样,AFAIK,一个moment日期从未成为有效的谓词比较值

我很沮丧。我想错了。我希望有理由为改变微风而破坏您的应用程序而道歉。我无法找到这个曾经有效的地方。我会问课程作者他是如何使它发挥作用的。

FWIW,你已经找到了今天微风的正确语法。

2014年12月13日更新

在课程作者Brian Noyes的帮助下,我发现了你发现的回归。虽然使用FilterQueryOp符号名称(例如,“greaterThanOrEqual”)作为操作名称和使用moment.js dates作为谓词比较值从未记录过,但它们显然在课程制作时起作用(围绕Breeze v.1.4.2)。我决定我们应该支持Brian在他的课程中展示并将其视为真正的回归。它们将在下一个微风版本(v.1.5.3?)

中得到支持

N.B。:Moment.js日期仅作为谓词比较值。在Breeze的其他任何地方,Moment.js尚不支持作为备用日期类型。我希望看到这种情况发生但现在还没有,我们还没有安排时间来增加支持。

答案 2 :(得分:0)

此处有关课程的作者。因为我同意Ward,所以不知道该说些什么 - 这从来就不是一个受支持的运算符作为字符串。它是FilterQueryOp枚举值之一的名称,因此我必须在输入代码时出错,我将枚举值名称复制/粘贴为字符串,而不是将其用作枚举值。很遗憾我在课程中发布了非功能性代码,下次更新课程时会更正。