методы, такие как Fetch
(для простых свойств) и FetchMany
(для коллекций свойств) метод будет создавать в T-SQL запроса к join
, выполняемую NHibernate и заполните свойство после выполнения. Это позволит избежать Lazy Loading в собственность. Но после вызова этих методов у вас все еще есть IQueryable<User>
(в вашем случае), потому что вы начали с него.
Чтобы получить результат (или сделать бросок), зависит от того, как вы бетона вашего LINQ запроса для выборки:
Для List<User>
, вы могли бы назвать ToList()
:
var result = session.Query<User>()
.Where(c => c.UserName == userName)
.FetchMany(c => c.Roles)
.ThenFetchMany(o => o.Permissions)
.ToList();
// and you could loop it:
foreach (var user in result)
{
// code...
}
Для одного User
объекта, вы могли бы назвать FirstOrDefault()
:
var result = session.Query<User>()
.Where(c => c.UserName == userName)
.FetchMany(c => c.Roles)
.ThenFetchMany(o => o.Permissions)
.FirstOrDefault();
// and you could use this User object,
// but make sure it is not null
if (result != null)
{
// code...
}
вы также можете изменить вывод с помощью -й e Select()
- объект DTO
, анонимный объект, конкретное значение и т. д. Для примера, чтобы вернуть анонимный объект (как правило, для использования в локальной области и выполнить простой запрос), используя метод Select()
.
var result = session.Query<User>()
.Where(c => c.UserName == userName)
.FetchMany(c => c.Roles)
.ThenFetchMany(o => o.Permissions)
.Select(u => new { u.Id, u.UserName })
.ToList(); // or FirstOrDefault();
Я буду переведен на тип 'Пользователь' –