如何在Dynamics NAV Web服务中使用OR表达式进行过滤?
嘿,我一眼就看出你这段代码的问题了——你把两个字段的过滤条件都赋值给了同一个filters[0]对象,结果第一个设置的FirstName直接被后面的ShortName覆盖了,最后实际只生效了ShortName的过滤,完全没实现你想要的OR逻辑。
在Dynamics NAV的Web Service中,要实现不同字段之间的OR过滤,你需要把两个条件合并到同一个Filter对象的Criteria属性里,用NAV原生支持的过滤语法来编写OR表达式。
正确代码示例
// 创建单个Filter对象,用来承载OR逻辑的条件 CustomerInterface.CustomerInterface_Filter filter = new CustomerInterface.CustomerInterface_Filter(); // Field可以指定任意一个存在的字段(这里选FirstName即可,不影响最终逻辑) filter.Field = CustomerInterface.CustomerInterface_Fields.FirstName; // 用NAV过滤语法编写OR条件,字符串值需要用单引号包裹 filter.Criteria = "FirstName = 'John' OR ShortName = 'John'"; // 调用ReadMultiple方法,传入包含这个Filter的数组 CustomerInterface.CustomerInterface[] response = service.ReadMultiple(new[] { filter }, null, 0);
简化写法(用管道符替代OR关键字)
NAV的过滤语法也支持用|作为OR的简写,代码可以更简洁:
filter.Criteria = "FirstName='John'|ShortName='John'";
额外说明
- 如果是同一字段的多个值需要用OR逻辑(比如FirstName是John或Jane),可以直接用逗号分隔:
FirstName='John','Jane' - 多个Filter对象默认是AND逻辑,所以如果直接传入两个Filter(一个FirstName,一个ShortName),会变成
FirstName='John' AND ShortName='John',这和你的需求正好相反。
内容的提问来源于stack exchange,提问作者jasvill
相关产品推荐
相关产品推荐

