如何使用NHibernate从数据库中获取对象?

时间:2010-07-09 15:31:03

标签: c# 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不可用......或者是它?!?!

4 个答案:

答案 0 :(得分:1)

我认为你可以在最后添加.List<Site>(),然后对其进行.FirstOrDefault()

答案 1 :(得分:1)

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

来自文档:

  

返回单一的便捷方法   与查询匹配的实例,或   如果查询未返回任何结果,则返回null。

答案 2 :(得分:0)

在调用List<T>()之前,您需要首先执行查询(通过在条件上调用FirstOrDefault)。请注意,此查询可能会返回多个对象:

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();
}

答案 3 :(得分:0)

您可以将linq与NHibernate一起使用。它位于NHiberante主干的NHibernate.Linq命名空间中。

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

如果您更喜欢基于Linq的API标准,则必须使用result.SetMaxResults(1).UniqueResult()创建等于IQueryable.FirstOrDefault

的内容