生成一个动态字符串来筛选rest调用



我正在尝试构建一个动态字符串,但我遇到了一个问题,所以我恳请社区提供帮助。

A有一个字符串来构建rest调用过滤器,但我对and's感到困惑

只有在只提供一个过滤条件的情况下,这个查询才有效,但我必须作为AND提供

var query;
var queryDefault = "IsLastForLevelAndParticipant eq 1";
this.state.participantFirstName
? query += "substringof('" +  this.state.participantFirstName + "',Participant/FirstName)" 
: queryDefault
this.state.participantLastName
? query += "substringof('" +  this.state.participantLastName + "',Participant/LastName)" 
: queryDefault

让我们看看。

如果我开始构建这个,并且只提供了一个过滤器,我会有一个加and

var query;
var queryDefault = "IsLastForLevelAndParticipant eq 1";
this.state.participantFirstName
? query += "substringof('" +  this.state.participantFirstName + "',Participant/FirstName) and " 
: queryDefault
this.state.participantLastName
? query += "substringof('" +  this.state.participantLastName + "',Participant/LastName)" 
: queryDefault
query += " and " + queryDefault

我有12个过滤器,我必须知道有多少个有值才能提供and子句

这是我的state

//Filters Certificates
startEmission: string;
endEmission: string;
startValidity: string;
endValidity: string;
participantFirstName: string;
participantLastName: string;
paticipantCertNumber: string;
selectYesNo: string;
selectLevel: string;

任何帮助都是奖金。

将所有可能的过滤器添加到数组中,过滤错误值,最后用" and "连接所有项。

var query = [
queryDefault,
this.state.participantFirstName && "substringof('" + this.state.participantFirstName + "',Participant/FirstName)"
this.state.participantLastName && "substringof('" + this.state.participantLastName + "',Participant/LastName)"
]
.filter(item => !!item)
.join(" and ");

顺便说一句。你在用OData吗?过滤器的结构看起来很熟悉。如果你这样做,我建议你使用这个库:https://github.com/techniq/odata-query#readme

由于我也在使用datetime,这里是的最终解决方案

var queryDefault = "IsLastForLevelAndParticipant eq 1";
var query = [
queryDefault,
this.state.startEmission && "(Date1 ge datetime'" + moment.utc(this.state.startEmission).toISOString() + "') and (Date1 le datetime'" 
+ moment.utc(this.state.endEmission).toISOString() + "')",
this.state.startValidity && "(Validto ge datetime'" + moment.utc(this.state.startValidity).toISOString() + "') and (Validto le datetime'" 
+ moment.utc(this.state.endValidity).toISOString() + "')",
this.state.participantFirstName && "(substringof('" + this.state.participantFirstName + "',Participant/FirstName))",
this.state.participantLastName && "(substringof('" + this.state.participantLastName + "',Participant/LastName))",
this.state.selectYesNo && "IsPrinted eq " + this.state.selectYesNo,
this.state.selectLevel && "Level/Title eq '" + this.state.selectLevel + "'"
]
.filter(filter => !! filter)
.join(" and ");
var q = JSON.stringify(query).substring(1).slice(0, -1);
console.log(JSON.stringify(query));

最新更新