2012-04-24 39 views
1

我懷疑這只是特定於NHibernate。但我的代碼如下....查詢使用OData和asp.net MVC webapi針對NHibernate數據庫

public class ClientController : ApiController 
    { 
     // GET /api/<controller> 
     public IQueryable<Api.Client> Get() 
     { 
      return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c)); 
     } 

我基本上要查詢中使用OData的標準數據庫....獲得相關的「客戶」對象,並把它們轉換成DTO「API。客戶'。

但是...代碼原樣不起作用。因爲NHibernate不知道用Mapper做什麼......它確實希望查詢在.Select之前出現。但我不確定我可以先獲得Odata查詢嗎?

,如果我做

return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c)).ToList().AsQueryable(); 

但是,這是一個有點蘇茨基因爲你必須從數據庫上做的OData查詢得到的所有客戶它將工作。

是否有無法讓OData查詢後發生「選擇」?或另一種方法來解決這個問題?

+0

其實我覺得當你想查詢只使用什麼繳費的DTO對象上的問題會更嚴重。你需要查詢通過映射界面,然後返回到數據庫..... – 2012-04-24 05:17:02

回答

0

的問題是,您要執行NH調用內部的C#代碼(Mapper.Map)(即轉換爲SQL)

你不得不手動映射Api.Client,或創建一個映射器實現,返回一個Expression<Func<Client, Api.Client>>並將其作爲參數直接傳遞給Select()

即使這樣,我不確定NHibernate是否會翻譯它。但你可以試試。

+0

是的,我知道這是我的問題....我不確定開箱即用真的有一個很好的解決方案。 – 2012-04-25 08:23:35

0

AutoMapper支持此方案與Queryable Extensions

public IQueryable<Api.Client> Get() { 
    return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c)); 
} 

成爲

public IQueryable<Api.Client> Get() { 
    return Repositories.Clients.Query().ProjectTo<Api.Client>(mapper.ConfigurationProvider); 
}