我正在尝试从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 :(得分: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