2015-06-19 121 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