Критерии Nhibernate и использование лямбда-выражений в запросах

привет, я новичок в NHibernate, и я немного запутался.

Предположим, у нас есть таблица product. Пусть в таблице product будет 2 столбца price1 и price2.

тогда я могу запросить отображаемые сущности продукта через HQL следующим образом:

string queryString = @"from product p
where p.price1 = p.price2 + 100 ";
IList result = session.CreateQuery(queryString).List();

Как я могу добиться этого с помощью ICriteria API.

Я знаю, что это абсурд, но я пытаюсь вот так:

session.CreateCriteria(typeof(product))
   .Add(Expression.Eq("price1", "price2" + 100))
   .List()

или, что более уместно, вот так (с использованием лямбда-расширений):

session.CreateCriteria(typeof(product))
   .Add<product>(p => p.price1 == (p.price2 + 100))
   .List()

на самом деле я загрузил проект лямбда-расширений из googlecode и расширил его, чтобы повторно обрабатывать двоичные и унарные выражения для реализации таких выражений, как:

session.CreateCriteria(typeof(product))
   .Add<product>(p => 
               (!(p.price1 > 29007) && (p.price1 > 19009)) 
            || (p.price2 == 29009));

В настоящее время я обрабатываю такие запросы, как указано выше, но арифметические предложения меня раздражают, так как я не могу вернуть соответствующее ограничение, чтобы получить нужный мне критерий.

mpffh я устал пытаться объяснить это исчерпывающе. я надеюсь, что это сработало. Любая помощь приветствуется.


person mutoss    schedule 19.11.2009    source источник


Ответы (1)


Вы можете попробовать это:

ISQLFunction sqlAdd = new VarArgsSQLFunction("(", "+", ")");
var products = session
    .CreateCriteria<product>()
    .Add(
        Expression.EqProperty(
            "price1", 
            Projections.SqlFunction(
                sqlAdd, 
                // TODO: replace this with appropriate type
                NHibernateUtil.Double,
                Projections.Property("price2"),
                Projections.Constant(100) 
            )
        )
    )
    .List<product>();
person Darin Dimitrov    schedule 19.11.2009
comment
ты очень много, этот диалектный перевод работал отлично. Фактически, это также дало мне еще один ключ к обработке выражений MethodCallExpressions, например = ›session.CreateCriteria (typeof (product)) .Add ‹product› (p =› p.price1.ToString () == (p.price2 + 100) .ToString ()) .List (), например, расширяя ваш путь, я знаю, что могу создать критерий eqProperty между двумя столбцами типа NUMBER и VARCHAR2, используя ToString () в выражениях. 2 подряд ... - person mutoss; 20.11.2009