0

我正在尝试将投影添加到 NHibernate LINQ 查询(通过.select()),但由于我有一些逻辑,我想使用辅助类而不是直接返回投影模型。

我的代码看起来像这样(缩短):

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对象转换为 a的对象MessageModel,它包含处理不同场景的逻辑,因为它都依赖于相关实体。

这失败并出现错误:

字段 Dal.Repositories.MessageRepository._messageModelHelper' 没有为类型“NHibernate.Linq.NhQueryable`1 [Domain.Entities.Message]”定义

如果我避免使用一个字段(这是 DI 所必需的),并执行以下操作:

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

我只是得到一个System.NotSupportedException.

看来我的方法行不通。我能做什么,同时避免new MessageModel直接返回的需要?另外我真的需要保持投影,我不能对可枚举进行操作。

4

1 回答 1

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 投影,因此将从数据库中选择完整的对象。

于 2015-06-19T10:02:26.240 回答