NHibernate HQL-запрос для сбора значений с несколькими значениями соответствия - PullRequest
1 голос
/ 14 июня 2011

Я пытаюсь написать запрос 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 ​​ соответствует любому из наборавходные строки с использованием «начинается с соответствия».При использовании NH LINQprovider я мог делать то, что хотел, используя такой запрос:

from entity in session.Query<Entity>() 
where entity.SomeValues.Any(val =>
  val.StartsWith("matchVal1") || val.StartsWith("matchVal2"))
select entity

Очевидно, что этот способ построения запроса не поддерживает произвольное количество параметров, но я решил это, создав частьвыражения LINQ динамически с использованием пространства имен System.Linq.Expressions .Результирующий SQL был для меня хорошим, так как он не содержал никаких ЛЮБЫХ / НЕКОТОРЫХ вызовов функций (кажется, не поддерживается SQLite, который я использую для некоторого модульного тестирования) и содержал только один подзапрос EXISTS.

Однако я больше не могу использовать NH LINQ, потому что мне нужно выполнить левое внешнее соединение с OtherEntity , и это не поддерживается в NH 3.0 (или NH 3.1 в этом отношении).Поскольку API-интерфейсы Criteria / QueryOver, по-видимому, не поддерживают фильтрацию по совокупности значений вообще, возможно, 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, по-видимому, переводит выражения LINQ в HQL перед созданием SQL.Может быть, есть способ получить этот промежуточный HQL?

Итак, любые предложения о том, как написать HQL-запрос или как преобразовать LINQ в HQL, будут высоко оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...