2

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

假设我们有一个产品表。让产品表有 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 扩展项目,并将其扩展为递归处理二进制和一元表达式以实现如下表达式:

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

我目前正在处理像上面这样的查询,但是算术子句让我很烦,因为我无法返回适当的限制来获得我需要的标准。

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

4

1 回答 1

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>();
于 2009-11-19T11:01:45.053 回答