我很习惯使用微风,而且目前只是看起来非常简单。
我有一个API调用,返回4个位置。然后使用breeze,我尝试使用where子句对其进行过滤,如下所示:
function getLocations(clientId) {
var self = this;
return EntityQuery.from('GetLocations')
.withParameters({ clientId: clientId })
.where("activeStatus", "==", "0")
.expand('LocationType')
.using(self.manager)
.execute()
.then(querySucceeded, this._queryFailed);
function querySucceeded(data) {
if (data.results.length > 1) {
locations = data.results;
}
return locations;
}
}
理想情况下,这应该给我0行,因为在所有4行中,' activeStatus'是1.然而,它仍然显示我所有4个结果。我尝试使用另一个针对locationType的过滤器,它的结果相同。 breeze side where子句不会被执行。
更新以回答问题:
以下是我的控制器中API调用的样子:
public object GetLocations(int clientId) {
}
如您所见,它只接受clientId作为参数,因此我使用with parameter
子句。我认为微风会照顾activeStatus where子句,而我不必在后端对其进行过滤。这是错的吗?
有人可以帮忙吗?
答案 0 :(得分:0)
Breeze文档表明withParameters通常用于非.NET后端或不识别oData URI的服务器。是否有可能因为.withParameters而忽略了where子句?你不能使用clientID过滤器重写where子句吗?
function getLocations(clientId) {
var self = this;
var p1 = new breeze.Predicate("activeStatus","==","0");
var p2 = new breeze.Predicate("clientId","==",clientId);
var p = p1.and(p2)
return EntityQuery.from('GetLocations')
.where(p)
.expand('LocationType')
.using(self.manager)
.execute()
.then(querySucceeded, this._queryFailed);
function querySucceeded(data) {
if (data.results.length > 1) {
locations = data.results;
}
return locations;
}
}
我先试试这个。或者将where子句放在withParameters语句中,具体取决于您的后端。如果这不起作用,那么可能还有其他选择。
祝你好运。
编辑:我使用的一个例子:
这是我查询的API端点:
// GET: breeze/RST_ClientHistory/SeasonClients
[HttpGet]
[BreezeQueryable(MaxExpansionDepth = 10)]
public IQueryable<SeasonClient> SeasonClients()
{
return _contextProvider.Context.SeasonClients;
}
以下是我使用的查询示例:
// qFilters is object. Values are arrays or strings, keys are id fields. SeasonClients might also be Clients
// Setup predicates
var p, p1;
// link up the predicates for passed data
for (var f in qFilters) {
var compareOp = Object.prototype.toString.call(qFilters[f]) === '[object Array]' ? 'in' : '==';
if (!qFilters[f] || (compareOp == 'in' && qFilters[f].length == 0)) continue;
fLC = f.toLowerCase();
if (fLC == "countryid") {
p1 = breeze.Predicate("District.Region.CountryId", compareOp, qFilters[f]);
} else if (fLC == "seasonid") {
p1 = breeze.Predicate("SeasonId", compareOp, qFilters[f]);
} else if (fLC == "districtid") {
p1 = breeze.Predicate("DistrictId", compareOp, qFilters[f]);
} else if (fLC == "siteid") {
p1 = breeze.Predicate("Group.Site.SiteId", compareOp, qFilters[f]);
} else if (fLC == "groupid") {
p1 = breeze.Predicate("GroupId", compareOp, qFilters[f]);
} else if (fLC == "clientid" || fLC == 'seasonclientid') {
p1 = breeze.Predicate("ClientId", compareOp, qFilters[f]);
}
// Setup predicates
if (p1) {
p = p ? p.and(p1) : p1;
}
}
// Requires [BreezeQueryable(MaxExpansionDepth = 10)] in controller
var qry = breeze.EntityQuery
.from("SeasonClients")
.expand("Client,Group.Site,Season,VSeasonClientCredit,District.Region.Country,Repayments.RepaymentType")
.orderBy("DistrictId,SeasonId,GroupId,ClientId");
// Add predicates to query, if any exist
if (p) qry = qry.where(p);
return qry;
这比它需要的时间长,但我想确保一个完整的工作示例在这里。您会注意到没有理由使用.withParameters。只要在服务器上正确设置了Context,链接谓词(where子句)应该可以正常工作。在这种情况下,我们创建where子句,最多10个ANDs过滤使用严格相等或IN集合,具体取决于qFilters对象中传递的内容。
我认为您应该摆脱后端控制器中的参数,使方法无参数,并在您的查询中包含clientId匹配作为附加谓词。
此方法还使您的API端点更加灵活 - 您可以将其用于各种查询,即使ClientId与它们无关。
这有帮助吗?如果您还有其他问题,请告诉我?