2015-09-17 2 views
1

Как и какой тип я должен отличать result до User или Role или Permission?CASTING Session.Query() в Nhibernate

пользователь имеет роли и роль имеет права

var result = session.Query<User>() 
        .Where(c => c.UserName == userName) 
        .FetchMany(c => c.Roles) 
        .ThenFetchMany(o => o.Permissions); 
+0

Я буду переведен на тип 'Пользователь' –

ответ

2

методы, такие как 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(); 
Смежные вопросы