嗨,我是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我厌倦了试图以全面的方式解释它。我希望它有效。任何帮助表示赞赏。
答案 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>();