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

时间:2011-06-14 15:53:12

标签: c# 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; }
}

我希望能够找到 Entity 的所有实例,其中 SomeValues 中的任何字符串都使用“starts with matching”匹配任何一组输入字符串。当使用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的建议。

0 个答案:

没有答案