2012-04-24 10 views
1

これはNHibernateに固有のものではないかと疑いがあります。しかし、私は、私は基本的には、関連する「クライアント」のオブジェクトを取得します.... ODATA基準を使用してデータベースを照会したい、とDTO「APIにそれらを変換し、次のようにNHibernateデータベースに対するODataとasp.net MVC webapiを使ったクエリ

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

....コードをしています。クライアント'。

しかし、コードはそのままで動作しません。 NHibernateはMapperを使って何をするべきかを知らないので、実際には.Selectの前にクエリが来ることを望んでいます。しかし、私は最初にオダータの質問を得ることができないのですか?

私は

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

を行うしかし、あなたは上のODataクエリを実行するために、データベースからすべてのクライアントを取得する必要がありますように、そのビットが嫌だ場合、それは動作します。

ODataクエリの後に "選択"が表示されるのはどうしてですか?またはこれにアプローチする別の方法?

+0

なりサポートしています。あなたはマッピングインターフェイスを経由してデータベースに戻るクエリを必要とします..... –

答えて

0

問題が

(それはSQLに変換されて)あなたはNHコール内部のC#コード(Mapper.Map)を実行しようとしているということであるあなたは、手動でApi.Clientをマッピングする、またはそのマッパーの実装を作成する必要があると思いますExpression<Func<Client, Api.Client>>を返し、パラメータとして直接Select()に渡します。

NHibernateがそれを翻訳するかどうかは分かりません。しかし、あなたは試すことができます。

+0

はい、これは私の問題です。 –

1

まだテストしていませんが、オープンソースプロジェクトNHibernate.ODataが役に立ちます。

0

AutoMapperはQueryable Extensions

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

と、このシナリオでは、実際に私は、クエリだけいただきまし盛DTOオブジェクト上を使用したいときに問題が悪化すると考え

public IQueryable<Api.Client> Get() { 
    return Repositories.Clients.Query().ProjectTo<Api.Client>(mapper.ConfigurationProvider); 
} 
関連する問題