Я пытаюсь добавить проекцию в запрос 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
? Также мне действительно нужно поддерживать проекцию, я не могу работать с перечислимым.
Хорошо, я должен был сделать это более ясным, но я действительно хочу сохранить прогноз ... Причина, по которой я не могу использовать 'AsEnumerable', так или иначе, состоит в том, что у нас есть собственный метод расширения для извлечения вычисленной коллекции. – MarioDS
@MDeSchaepmeester Затем сначала вы просматриваете страницу, затем из результата подкачки вы делаете '_messageModelHelper.BuildMessageModel (m)', как var result2 = result.Select (m => _messageModelHelper.BuildMessageModel (m)). ToArray(); – xanatos
@xantos: да, но до сих пор нет проекции, я хочу сохранить преимущества этой производительности. – MarioDS