gpt4 book ai didi

breeze - 如何测试空的 Breeze 谓词?

转载 作者:行者123 更新时间:2023-12-04 02:52:40 33 4
gpt4 key购买 nike

我正在使用 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 上的某些属性或方法。

最佳答案

由于您的谓词或过滤器对象是一个数组,因此只需测试长度即可。如果它为零,则不要应用 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 以及您以后可能使用的任何其他内容,然后处理传入的对象或变量是否为空。我觉得这是编写可重用代码的最佳方法。例子 -
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);
}

通过在以后每次需要过滤数据时执行此操作,您可以在数据服务中或直接从 View 模型中定义方法以遵循获取模式。现在,当您返回并更改模型或其他内容时,您需要调整一个查询而不是 20 个。

关于breeze - 如何测试空的 Breeze 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17324106/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com