breezeJS自定义谓词

breezeJS自定义谓词,breeze,single-page-application,Breeze,Single Page Application,我想写一个稍微复杂的查询,所以我想知道是否有办法提供一个自定义函数作为where子句的谓词 例如,如果我们可以做以下事情,那就太好了: var myArray = [1, 2, 3]; var filter = function (person) { return elementExists(person.id, myArray); }; EntityQuery.from('persons').toType('Person') .where(filter);

我想写一个稍微复杂的查询,所以我想知道是否有办法提供一个自定义函数作为where子句的谓词

例如,如果我们可以做以下事情,那就太好了:

 var myArray = [1, 2, 3];

 var filter = function (person) {
    return elementExists(person.id, myArray);
 };

 EntityQuery.from('persons').toType('Person')
       .where(filter);
查看源代码,我意识到在最新版本的BreezeJS中没有这种功能(我可能错了)


我只是想知道breeze是否支持类似的操作。

在客户端,您应该能够通过检查返回的长度来确定元素是否存在

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

    }

};
这个例子比您要求的要复杂得多,所以请删掉您不想简化查询的部分。我在这里向您展示如何在查询中同时使用“and”和“or”。我还展示了如何检查本地元数据存储,以查看在转到服务器之前该项是否存在

如果该项不存在,并且您希望创建它,请注意线程计时,并在执行导航到另一个页面以显示新项等操作之前,将对象创建包装在承诺中。导航可能比创建功能快,并且新项目可能还没有通过敲除绑定到viewmodel中,因此它可能在新页面上显示为空白。那会让你在相当长的一段时间里发疯