2015-06-19 3 views
2

Мне нужно выполнить запрос, который выглядит примерно так в SQL:Nhibernate - Использование значения столбца в QueryOver.IsLike

select * from Codes where Value1 like '%' + Value2 + '%' 

Есть ли способ сделать это с помощью FluentNHibernate и QueryOver? Я искал что-то вроде этого

Session.Query<Code>().WhereRestrictionOn(c => c.Value1).IsLike(c => c.Value2); 

, но, к сожалению, IsLike требует object или значение string в качестве аргумента.

ответ

1

Один из способов здесь было бы использовать только необработанный SQL Критерий:

Session 
    .Query<Code>() 
    //.WhereRestrictionOn(c => c.Value1).IsLike(c => c.Value2); 
    .Where(Expression.Sql(" Value1Column LIKE '%' + Value2Column + '%' ")); 

Он представляет собой необработанный SQL, поэтому мы должны использовать имена столбцов, не сопоставленные свойства здесь ... Но в исключительных случаях, таких как это, это точка расширения NHibernate

4

Как и было предложено, вы можете использовать критерий SQL. Я бы поместил его в метод расширения, хотя это немного более многоразово, если это то, что вы часто используете. Что-то вроде этого ...

public static IQueryOver<TRoot, TSubType> WhereLike<TRoot, TSubType>(this IQueryOver<TRoot, TSubType> query, Expression<Func<TSubType, object>> thisLike, Expression<Func<TSubType, object>> likeThis) 
    { 
     var propName1 = ExpressionProcessor.FindMemberExpression(thisLike.Body); 
     var propName2 = ExpressionProcessor.FindMemberExpression(likeThis.Body); 
     query.Where(NHibernate.Criterion.Expression.Sql(string.Format(" {0} LIKE '%' + {1} + '%' ", propName1, propName2))); 
     return query; 
    } 

Используйте как так

  var query = session.QueryOver<Code>() 
       .WhereLike(thisLike => thisLike.Value1, likeThis => likeThis.Value2); 
+1

Единственное, я бы, вероятно, заменить два ', object' с', string' – xanatos

+0

Да, это работает, и это достаточно хорошо для моего дела. Но это не лучшее решение для использования в реальных приложениях. Сгенерированный SQL не зависит от базы данных, и он не работает для сложных запросов (например, если запрос содержит столбцы с одинаковыми именами из разных таблиц). Кажется странным, что NHibernate не предоставляет такую ​​простую функциональность из коробки – holdenmcgrohen

Смежные вопросы