如何测试空的Breeze谓词?

时间:2013-06-26 15:19:50

标签: breeze

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

客户端 - 创建过滤器谓词

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

客户端 - 上下文查询

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 Predicate上的一些属性或方法。

1 个答案:

答案 0 :(得分:4)

由于谓词或过滤器对象是一个数组,因此只需测试长度。如果它为零,则不要应用where子句。您已经定义了查询,因此无需执行任何其他操作。

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,take以及之后可能使用的任何其他内容,然后处理传入的对象或变量是否为null。我觉得这是编写可重用代码的最佳方法。示例 -

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。