2010-07-09 43 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

相关问题