我正在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;。
解决了这个问题是什么导致表达式错误?
答案 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,你已经找到了今天微风的正确语法。
在课程作者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枚举值之一的名称,因此我必须在输入代码时出错,我将枚举值名称复制/粘贴为字符串,而不是将其用作枚举值。很遗憾我在课程中发布了非功能性代码,下次更新课程时会更正。