2009-11-19 78 views
2

您好我是NHibernate中的新成員,我有點困惑。Nhibernate ICriteria和在查詢中使用Lambda表達式

假設我們有一個產品表。 讓產品表有2列price1和price2。

通過HQL那時,我可以查詢mapped產品實體如下:

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和我擴展它以recused處理二進制和一元表達式來實現表達式,如:

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

我目前正在處理像上面這樣的查詢,但算術子句令我煩惱,因爲我無法返回適當的限制來獲得我需要的標準。

mpffh我厭倦了試圖全面解釋它。我希望它工作。任何幫助表示讚賞。

回答

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>(); 
+0

TY非常多,那方言翻譯工作完美。實際上,它也給我提供了另一條處理MethodCallExpressions的線索,例如=> session.CreateCriteria(typeof(product)) .Add (p => p.price1.ToString()==(p.price2 + 100).ToString()) .List() 例如,擴展您的方式,我知道能夠在表達式中使用ToString()在NUMBER和VARCHAR2類型的2列之間創建eqProperty標準。 2連續... – mutoss 2009-11-20 10:20:35

相關問題