如何使用 MDriven OclPs 查找匹配字符串列表的所有对象?
How to use MDriven OclPs to find all objects matching a list of strings?
在一个应用程序中,我收到了一个字符串列表。然后我想使用 OclPs 查找特定属性等于列表中任何字符串的所有对象。例如。如果我们有 Person 对象并收到姓氏列表,请查找姓氏出现在列表中的所有人。
虽然这肯定可以在 MDriven 的内存 OCL 引擎中完成,但我似乎无法在更有限的 OclPs 中实现这一点(它将 OCL 转换为 SQL 并在数据库)。
尝试 1:首先将名称列表分配给 vNames
(字符串集合),然后:
Person.allInstances->select(p|vNames->exists(n|n = p.LastName))
这给出了错误“循环变量只能有 class 类型,不能有 System.String”。
尝试 2:首先将搜索名称的 "|"
分隔字符串(包括前导和尾随 "|"
)分配给 vNames
,然后:
Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))
这给出了错误,指出无法在 Firebird 中添加字符串。但是 Firebird 确实支持使用 ||
运算符的字符串连接。
尝试使用 .Contains(...)
而不是 .SqlLike(...)
表示它在 OclPs 中不受支持。此外,它会找到姓氏包含在任何搜索名称中的人,即不正确的搜索。
我没主意了...
建议您使用正版OCL工具。您似乎在证明 MDriven OclPs 不是 OCL。
在这种情况下,当您有一长串字符串并且想要一个对象列表时,我认为您最好的选择是将 SQL 与 sqlpassthroughobjects 一起使用:
https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects
Person.sqlpassthroughobjects('select personid from person where lastname in ('+vNames->collect(n|'\''+n+'\'')->asCommaList+')')
oclPS 只实现了 OCL 的一个相当小的子集,因为它将 OCL 转换为 sql。
例如,不能使用“非对象”的集合。
Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))
而是在此处查看 sqlpassthroughobjects
https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects
您也可以将名称作为 class 的对象插入数据库,然后使用 oclPS。
在一个应用程序中,我收到了一个字符串列表。然后我想使用 OclPs 查找特定属性等于列表中任何字符串的所有对象。例如。如果我们有 Person 对象并收到姓氏列表,请查找姓氏出现在列表中的所有人。
虽然这肯定可以在 MDriven 的内存 OCL 引擎中完成,但我似乎无法在更有限的 OclPs 中实现这一点(它将 OCL 转换为 SQL 并在数据库)。
尝试 1:首先将名称列表分配给 vNames
(字符串集合),然后:
Person.allInstances->select(p|vNames->exists(n|n = p.LastName))
这给出了错误“循环变量只能有 class 类型,不能有 System.String”。
尝试 2:首先将搜索名称的 "|"
分隔字符串(包括前导和尾随 "|"
)分配给 vNames
,然后:
Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))
这给出了错误,指出无法在 Firebird 中添加字符串。但是 Firebird 确实支持使用 ||
运算符的字符串连接。
尝试使用 .Contains(...)
而不是 .SqlLike(...)
表示它在 OclPs 中不受支持。此外,它会找到姓氏包含在任何搜索名称中的人,即不正确的搜索。
我没主意了...
建议您使用正版OCL工具。您似乎在证明 MDriven OclPs 不是 OCL。
在这种情况下,当您有一长串字符串并且想要一个对象列表时,我认为您最好的选择是将 SQL 与 sqlpassthroughobjects 一起使用:
https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects
Person.sqlpassthroughobjects('select personid from person where lastname in ('+vNames->collect(n|'\''+n+'\'')->asCommaList+')')
oclPS 只实现了 OCL 的一个相当小的子集,因为它将 OCL 转换为 sql。
例如,不能使用“非对象”的集合。
Person.allInstances->select(p|vNames.SqlLike('%|' + p.LastName + '|%'))
而是在此处查看 sqlpassthroughobjects https://wiki.mdriven.net/index.php/OCLOperators_sqlpassthroughobjects
您也可以将名称作为 class 的对象插入数据库,然后使用 oclPS。