我想写一个稍微复杂的查询,所以我想知道是否有办法提供自定义函数作为where子句的谓词。
例如,如果我们可以做类似的事情会很好:
var myArray = [1, 2, 3];
var filter = function (person) {
return elementExists(person.id, myArray);
};
EntityQuery.from('persons').toType('Person')
.where(filter);
查看源代码我意识到最新版本的BreezeJS中没有这种功能(我可能错了)。
我只是想知道微风是否支持类似的东西。
答案 0 :(得分:1)
在客户端,您应该能够通过检查返回的长度来确定元素是否存在。
var getItems = function (runId, tankId, topicId) {
var localquery = EntityQuery.from("Items")
.using(manager);
var p1 = new breeze.Predicate("runId", "eq", runId);
var p2 = breeze.Predicate("tankId", "eq", window.app.vm.tanks.activetank());
var p3 = breeze.Predicate("topicId", "eq", topicId);
var p4 = breeze.Predicate("topicId", "eq", app.Topics.Growth_Topic);
var pred;
var runId = p1._value;
var tankId = p2._value;
// If the third parameter exists, add it to your complex predicate
// adding a specific Topic to the predicate
// Otherwise only add the General topic
if (p4)
pred = breeze.Predicate.or([p3, p4]);
else
pred = breeze.Predicate.or(p3);
var newpred = breeze.Predicate.and([p1, p2, pred]);
// newpred is now querying for a specific runId and tankId and (p3 or p4) if p4 exists
// otherwise it is querying for runId and tankId or (p3)
// So look in the local metadataStore first
var queryb = localquery.where(newpred);
var results = manager.executeQueryLocally(queryb);
// If we do have it locally use it
if (results.length) {
window.app.vm.Items.Items(results);
}
// otherwise get it from the database
else {
var query = EntityQuery
.from("Items")
.where(newpred);
// return the promise from breeze
return manager.executeQuery(query)
.then(function (data) {
// check to see if the call to the webapi controller returned any data
if (data.length > 0) {
// stick it into the viewmodel it to your viewmodel
window.app.vm.Items.Items(data.results);
return "element exists";
} else {
return "element does not exist";
}
})
.fail(queryFailed);
}
};
这个例子比你要求的要复杂得多,所以删除了你不想简化查询的部分。我在这里向您展示如何在查询中同时获得“和”和“或”。我还展示了如何检查本地metadataStore,以便在转到服务器之前查看该项是否存在。
如果该项目不存在而您想要创建它,请注意您的线程计时并将对象创建包装在承诺中,然后再执行导航到另一个页面以显示新项目。导航可能比创建功能更快,并且新项目可能尚未被敲除绑定到您的viewmodel中,因此它可能在新页面上显示为空白。这会让你疯狂一段时间。