首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试空的Breeze谓词?

如何测试空的Breeze谓词?
EN

Stack Overflow用户
提问于 2013-06-26 15:19:50
回答 1查看 1.2K关注 0票数 2

我在用Breeze过滤客户要求的数据。我的代码看起来有点像这样:

客户端-创建过滤器谓词

代码语言:javascript
复制
var predicates = [];
var criteriaPredicate = null;
$.each(selectedFilterCriteria(), function (index, item) {
    criteriaPredicate = (index == 0)
        ? breeze.Predicate.create('criteriaId', breeze.FilterQueryOp.Equals, item)
        : criteriaPredicate.or('criteriaId', breeze.FilterQueryOp.Equals, item);
if (breeze.Predicate.isPredicate(criteriaPredicate)) {
    predicates.push(criteriaPredicate);
}

// Repeat for X Filter Criteria

var filter = breeze.Predicate.and(predicates);
return context.getAll(filter, data);

客户端上下文查询

代码语言:javascript
复制
function getAll(predicate, dataObservable) {
    var query = breeze.EntityQuery.from('Data');
    if (breeze.Predicate.isPredicate(predicate)) {
        query = query.where(predicate);
    }
    return manager.executeQuery(query).then(success).fail(failure);
}

问题

我对请求有一个问题,因为如果没有设置筛选器,我会应用一个“空”谓词(由于var filter = breeze.Predicate.and([])行),从而产生一个类似于http://mysite/api/app/Data?$filter=的请求。请求是无效的OData查询,因为$filter参数的值不能为空。

有什么好办法让我检查空谓词吗?我知道我可以重构我的客户端代码,使其不使用谓词,除非至少有一个可过滤项,但我想首先检查一下是否忽略了Breeze谓词上的某些属性或方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-26 16:20:06

由于谓词或筛选器对象是数组,所以只需测试长度。如果为零,则不要应用where子句。您已经定义了查询,因此不需要做任何其他操作。

代码语言:javascript
复制
function getAll(predicate, dataObservable) {
    var query = breeze.EntityQuery.from('Data');
    if (breeze.Predicate.isPredicate(predicate) && predicate.length !==0) {
        query = query.where(predicate);
    }
    return manager.executeQuery(query).then(success).fail(failure);
}

编辑

在你的问题中,我意识到你说在我给出答案之后你可以重构你的代码。在不涉及太多细节的情况下,我选择创建可以动态创建的可重用查询,以减少在更改模型时必须更改多少代码。这似乎也是你想要做的。我建议构建一个足够健壮的查询,该查询可以接受谓词、orderBy、later和以后可能使用的任何其他内容,然后处理传入的对象或变量是否为null。我觉得这是编写可重用代码的最佳方法。例子-

代码语言:javascript
复制
function getEntities(dataObservable, predicates, orderby, take, local) {
    var query = breeze.EntityQuery.from('Data');

    if (local) {
        query = query.executeQueryLocally();
    }
    if (orderBy) {
        query = query.orderBy(orderby);
    }
    if (take) {
        query = query.take(take);
    }
    if (breeze.Predicate.isPredicate(predicate) && predicate.length !==0) {
        query = query.where(predicate);
    }
    return manager.executeQuery(query).then(success).fail(failure);
}

通过这样做,每次您需要过滤数据时,您都可以在数据服务中定义方法,或者直接从视图模型中定义方法,以遵循提取模式。现在,当您返回并更改您的模型或其他东西时,您需要调整一个查询,而不是20个查询。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17324106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档