Я пытаюсь написать запрос 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, будут высоко оценены.