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的建议都将受到赞赏。     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)