У меня есть таблица, как:Nhibernate спасаясь специальный символ в Linq запрос
TABLE_XY
|ID |SOURCE|
|1 |value_aa|
|2 |other_aa|
|3 |eeeaa|
И сгенерированный запрос должен быть:
select * from TABLE_XY where SOURCE like '%\_aa' ESCAPE '\'
Я знаю, что есть два варианты, которые соответствуют моим потребностям
var result =
session.QueryOver<TableXy>()
.WhereRestrictionOn(x => x.Source)
.IsLike("%\_aa", MatchMode.Exact, '\\')
.List();
или
var result2 = session
.CreateCriteria<TableXy>()
.Add(LikeExpression("Source", "%\\_aa", MatchMode.Exact, '\\', false))
.List();
Но я должен использовать реализацию основанного Linq. Я работаю с динамически создаваемыми деревьями выражений, которые иногда будут выполняться с Linq to Object Provider или Linq to Nhibernate. Но в настоящее время только этот метод поддерживается:
var result = session
.Query<TableXy>()
.Where(x => NHibernate.Linq.SqlMethods.Like(x.Source, "%\\_aa"))
.ToList();
Как я могу продлить поставщик Nhibernate Linq для поддержки?
SqlMethods.IsLike(string source, string pattern, char? escape);
Nice! Ваше решение работает так, как я ожидал! Единственное изменение, которое я сделал: вместо создания нового ASTFactory я делаю это 'var factory = treeBuilder.Constant (null) .Factory', чтобы получить внутреннюю фабрику. Я не знаю, если это на 100% правильно, но это работает – Matthias