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は、オブジェクトを に変換するオブジェクトであり、関連するエンティティにすべて依存するため、さまざまなシナリオを処理するロジックが含まれていますMessageInstanceMessageModel

これはエラーで失敗します:

フィールド 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 プロジェクションを行わないため、完全なオブジェクトが DB から選択されることに注意してください。

于 2015-06-19T10:02:26.240 に答える