NHibernate HQL查询用于收集具有多个匹配值的值

|| 我正在尝试为具有值(字符串)集合的实体编写HQL(NHibernate 3.0)查询。简化得多的实体:
public class Entity {
  public int Id { get; protected set;}
  public OtherEntity OtherEntity { get; set; }
  public IList<string> SomeValues { get; set; }
}
我希望能够找到所有实体实例,其中SomeValues中的任何字符串都可以使用\“以matchs开头\”来匹配一组输入字符串中的任何一个。当使用NH LINQprovider时,我可以使用以下查询来做我想做的事情:
from entity in session.Query<Entity>() 
where entity.SomeValues.Any(val =>
  val.StartsWith(\"matchVal1\") || val.StartsWith(\"matchVal2\"))
select entity
显然,这种构建查询的方式不支持任意数量的参数,但我通过使用System.Linq.Expressions命名空间动态构建LINQ表达式的一部分来解决了该问题。生成的SQL对我来说是好的,因为它不包含任何ANY / SOME函数调用(SQLite似乎不支持它,我在某些单元测试中使用过),并且仅包含一个EXISTS子查询。 但是,我不能再使用NH LINQ,因为我需要与OtherEntity进行左外连接,并且在NH 3.0(或NH 3.1)中不支持此方法。由于Criteria / QueryOver API似乎不支持在所有HQL上对值集合进行过滤,这可能是我唯一的选择,但我无法提出一种编写查询的好方法:我最近的查询是:
select entity from Entity as entity 
where 
  \'matchVal1\' in elements(entity.SomeValues) or
  \'matchVal2\' in elements(entity.SomeValues)
上面查询的主要问题是它仅执行相等匹配,而不是类似匹配。我认为这样可以解决问题:
where \'matchVal1%\' like any elements(entity.SomeValues)
但这甚至不能翻译成SQL(引发NHibernate.Hql.Ast.ANTLR.QuerySyntaxException)。另一个问题是上述策略会导致多个子选择。 我尝试进行的搜索对我来说并不奇怪,因此我不禁觉得必须有一个简单的解决方案。另外,确实必须有一种在HQL中编写此查询的方法,因为NH LINQ提供程序似乎在生成SQL之前将LINQ表达式转换为HQL。也许有一种方法可以检索此中间HQL? 因此,任何有关如何编写HQL查询或如何将LINQ转换为HQL的建议都将受到赞赏。     
已邀请:

要回复问题请先登录注册