Nhibernate ICriteria和在查询中使用Lambda表达式

时间:2009-11-19 10:17:51

标签: nhibernate hql icriteria

嗨,我是NHibernate的新手,我有点困惑。

假设我们有一个产品表。 让 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()

或者更合适(使用lambda扩展名):

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

实际上我从googlecode下载了lambda扩展项目,并将其扩展为重复处理Binary和Unary表达式以实现表达式:

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

我目前正在处理上述查询,但算术条款令我讨厌,因为我无法返回适当的限制来获得我需要的标准。

mpffh我厌倦了试图以全面的方式解释它。我希望它有效。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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>();