Nhibernate ICriteria и использование лямбда-выражений в запросах - PullRequest
2 голосов
/ 19 ноября 2009

Привет, я новичок в 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 Я устал пытаться объяснить это всесторонне. Я надеюсь, что это сработало. Любая помощь приветствуется.

1 Ответ

1 голос
/ 19 ноября 2009

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

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>();
...