Я пытаюсь вернуть объект от запроса NHibernate.
Мой метод следующие:
public Site GetSiteByHost(string host)
{
var result = _session.CreateCriteria<Site>()
.Add(SqlExpression.Like<Site>(g => g.URLName, host));
return result;
}
проблема, result
тип HNibernate. ICriteria.
Как я могу заставить это возвращать a Site
объект?
Если бы я делал это с LINQ к SQL, то это было бы что-то как .FirstOrDefault()
но это не доступно с NHibernate... или является им?!?!
Вам нужно сначала выполнить запрос (вызвав List
на критерии) перед вызовом 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();
}
Я считаю, что .UniqueResult ()
- это то, что вам нужно ...
из документации:
Удобный метод для возврата одного экземпляр, соответствующий запросу, или null, если запрос не возвращает результатов.
Я думаю, вы можете поместить .List
в конец, а затем выполнить на нем .FirstOrDefault ()
.
Linq можно использовать с NHibernate. Он находится в пространстве имен NHibernate.Linq в стволе NHiberante.
return session.Query<Site>().FirstOrDefault(site => site.UrlName.Contains(host));
Если вы предпочитаете API критериев Linq, вы должны использовать result. SetMaxРезультаты(1). UniqueResult()
для создания чего-то, равного IQueryable.FirstOrDefault