2015-06-19 12 views
0

Я пытаюсь добавить проекцию в запрос NHibernate LINQ (через .select()), но поскольку у меня есть немного логики, я хочу использовать вспомогательный класс, а не возвращать проецируемую модель напрямую.Проект NHibernate LINQ с использованием вспомогательного класса

Мой код выглядит следующим образом (укороченный):

var query = Session.Query<MessageInstance>(); 
... (a few .Fetch and .ThenFetch calls) 
var result = query.Where(specification.IsSatisfiedBy()) 
        .OrderBy(m => m.CreationDate) 
        .Select(m => _messageModelHelper.BuildMessageModel(m)); 

_messageModelHelper это объект, который превращает мой MessageInstance объект в MessageModel и содержит логику для обработки различных сценариев, так как все зависит от связанных с ними лиц.

Это с ошибкой:

Field Dal.Repositories.MessageRepository._messageModelHelper' is not defined for type 'NHibernate.Linq.NhQueryable`1 [Domain.Entities.Message]'

Если я не использовать поле (которое необходимо для DI), и сделать это:

.Select(m => new MessageModelHelper().BuildMessageModel(m)) 

Я просто получить System.NotSupportedException.

Похоже, что мой подход не будет работать. Что я могу сделать, избегая при этом необходимости возвращать new MessageModel? Также мне действительно нужно поддерживать проекцию, я не могу работать с перечислимым.

ответ

0

Вы должны вызвать BuildMessageModel() «локально»:

var result = query.Where(specification.IsSatisfiedBy()) 
        .OrderBy(m => m.CreationDate) 
        .AsEnumerable() // From this point onward the query 
            // will be executed C#-side 
        .Select(m => _messageModelHelper.BuildMessageModel(m)); 

Обратите внимание, что, как написано, это не будет делать проекцию SQL, так что полный объект будет выбран из БД.

+0

Хорошо, я должен был сделать это более ясным, но я действительно хочу сохранить прогноз ... Причина, по которой я не могу использовать 'AsEnumerable', так или иначе, состоит в том, что у нас есть собственный метод расширения для извлечения вычисленной коллекции. – MarioDS

+0

@MDeSchaepmeester Затем сначала вы просматриваете страницу, затем из результата подкачки вы делаете '_messageModelHelper.BuildMessageModel (m)', как var result2 = result.Select (m => _messageModelHelper.BuildMessageModel (m)). ToArray(); – xanatos

+0

@xantos: да, но до сих пор нет проекции, я хочу сохранить преимущества этой производительности. – MarioDS