2011-05-11 39 views
10

我一直在尋找互聯網,無法找到如何使用NHibernate的3.0 例如,queryover我想用在queryover 前的where子句字符串函數的例子:我可以在NHibernate QueryOver中使用SQL函數嗎?

var item = Query.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault(); 

但是這不起作用,因爲nhibernate無法理解ToLower,所以如何以一種可能的方式擴展方言?

回答

9
session.QueryOver<Foo>() 
    .Where(Restrictions.Eq(
     Projections.SqlFunction("lower", NHibernateUtil.String, 
      Projections.Property<Foo>(x => x.Name)), 
     name.ToLower())) 

應該讓你SQL LIKE where lower(Name) = @p0

+0

嗨,謝謝你的回覆,確實有效,你不知道我搜索這個解決方案需要多長時間。謝謝 –

+0

@Ruben Monteiro沒有問題,我發現有時你需要在使用QueryOver時混合一些標準。 – dotjoe

0

我相信它的作品至少在我使用的版本(版本3.0.0.4000)......下面是我的榜樣......

var reasons = _session.Query<Reason>(); 
var myReason = (from r in reasons 
       where r.IsCritical 
        && r.ReasonCode.ToUpper() == reasonCode.ToUpper() 
       select r).FirstOrDefault(); 

給它一個鏡頭,讓我知道,如果它的工作原理你...

+0

這導致其中一個使用UPPER()在SQLServer的功能...(這可能對性能不好條款... FYI ) – Todd

+0

我試過這個var query = Session.GetISession()。QueryOver (); var item =(from f in query where where f.Description.ToLower()== description.ToLower()select f).List()。FirstOrDefault );並得到這個錯誤在epression中無法識別的方法調用f.Description.ToUpper(),我的版本的nHibernate如果3.1.0.4000,@Todd - 我知道性能問題,但我需要這樣實現它 –

+0

有趣的...你的權利當你使用QueryOver語法時它不起作用......我的猜測是有一天會被修復......根據你的需要,你可以移動到使用查詢語法來實現這一點,它應該工作......你的代碼將會是更新如下... – Todd

相關問題