2010-07-09 44 views
1

我想從NHibernate查詢中取回對象。如何用NHibernate從數據庫中獲取對象?

我的方法如下:

public Site GetSiteByHost(string host) 
{ 
    var result = _session.CreateCriteria<Site>() 
     .Add(SqlExpression.Like<Site>(g => g.URLName, host)); 

    return result; 
} 

問題是,result是一種類型的HNibernate.ICriteria。

我怎樣才能得到這個返回一個Site對象?

如果我是用LINQ to SQL來做這件事,它會是類似於.FirstOrDefault()但這對NHibernate不可用...或者它是?!?!

回答

0

在調用FirstOrDefault之前,您需要先執行查詢(通過在條件上調用List<T>())。請注意,此查詢可能返回多個對象:

IEnumerable<Site> sites = _session 
    .CreateCriteria<Site>() 
    .Add(SqlExpression.Like<Site>(g => g.URLName, host)) 
    .List<Site>(); 

而且你可以採取第一種:

Site result = sites.FirstOrDefault(); 

或直接:

public Site GetSiteByHost(string host) 
{ 
    return _session 
     .CreateCriteria<Site>() 
     .Add(SqlExpression.Like<Site>(g => g.URLName, host)) 
     .List<Site>() 
     .FirstOrDefault(); 
} 
+0

東西等於這可如果你正在使用NHibernate的2.1.2比需要 – Paco 2010-07-09 18:56:00

1

我想你可以把一個.List<Site>()上結束,然後做.FirstOrDefault()就可以了。

1

我相信.UniqueResult()是你追求的...

從文檔:

的便捷方法,返回與查詢匹配空,如果該查詢返回單個 實例或 沒有結果。

0

你可以在NHibernate中使用linq。它位於NHiberante主幹中的NHibernate.Linq命名空間中。

return session.Query<Site>().FirstOrDefault(site => site.UrlName.Contains(host)); 

當你更喜歡LINQ的標準API,你必須使用result.SetMaxResults(1).UniqueResult()創建於IQueryable.FirstOrDefault

+0

從數據庫中裝載更多的行,你需要NHContrib中的NHibernate.LINQ。 – JulianM 2010-07-10 02:36:40

相關問題