2

私はServiceStackを使っています。私は、クエリー可能なデータAPIを実装する必要があることを知りました。このプロジェクトに入る前に、半分のOData実装が完了しました。私はむしろそれを働かせるためにそれを試して除草したくないでしょう。AutoQueryの洞察が必要です

私はAutoQueryを使用します。私は私たちのSQL Serverデータベースでそれを試してみたいです。私はhttp://docs.servicestack.net/autoquery-rdbmsの例を見ていますが、私の人生にとってはこれがうまくいくわけではありません。私がここで紛失しているものはありますか?

SQL照会にORMLiteを使用していますが、私が作成した統合テストでは、期待通りに動作することが示されています。私は、OrmLiteConnectionFactoryをコンテナに登録しました。また、依存性注入のためにそれを使用するリポジトリも登録しました。

public class ReportService : Service 
{ 
    public object Get(DetailQuery dq) 
    { 
     // not sure what to put here? 
    } 
} 

付:

public class Detail 
{ 
    public string Div { get; set; } 
    public string Reg { get; set; } 
} 

[Route("/report/detail")] 
public class DetailQuery : QueryDb<Detail> 
{ 
    public string[] Div { get; set; } 
    public string[] Reg { get; set; } 
} 

メッセージ、DetailQuery、私のサービスで使用されています。これまでのコードに

具体的な、私はタイプ、およびQueryDbに基づいてメッセージを持っていますそのすべてを、私は管理インターフェースでAutoQueryサービスのインスタンスを見ることができます。私がクエリインターフェイスで遊んだとき、私はサービスのエンドポイントに当たって、私が期待しているデータを見ました - 'Div'と 'Reg'コレクションの値をフィルタリングします。私がここで「ちょうどうまくいく」ために欠けているのは何ですか?私はServiceStackでサービス自体からリポジトリにアクセスしましたが、ここではAutoQueryがどのような意味を持つのかについていくつかの洞察を得ようとしています。私はまだこれがどのように働くのか「まっすぐ進む」例を見ていないのですか?それとも、そこにない金の鉢を探していますか?

答えて

3

AUTOQUERY作品with just the Request DTOすなわちそれので、あなたのクエリを任意のサービス実装を必要としません:Detail RDBMS表を照会します/report/detailから呼び出さ

[Route("/report/detail")] 
public class DetailQuery : QueryDb<Detail> 
{ 
    public string[] Div { get; set; } 
    public string[] Reg { get; set; } 
} 

。しかし、正確に一致するようにするには、Detailテーブルの列(たとえばDivまたはReg)と一致させる必要がありますが、通常は完全一致は配列の場合はスカラ値文字列、例えば:

public string[] Divs { get; set; } 
public string[] Regs { get; set; } 
:あなたは querying a collectionなら

public string Div { get; set; } 
public string Reg { get; set; } 

かわり値は、それらが通常複数形している。その場合には値のリストを含んでいるでしょうでクエリを作ることにしたいです

と呼び出すことができます:それはそれはimplicit convention、Eと一致する必要がありますあなたが望む行動はない場合

SELECT * FROM Detail WHERE Div IN ('A','B') AND Rev IN ('C','D') 

:に似たクエリを実行します

/report/detail?Divs=A,B&Regs=C,D 

。G:クエリその後、意志

public string[] DivBetween { get; set; } 

SELECT * FROM Detail WHERE Div BETWEEN 'A' AND 'B' 

あなたがあなたに望んでいた場合は可能性がoverride the AutoQuery service with a custom implementation、例えば:

public class MyQueryServices : Service 
{ 
    public IAutoQueryDb AutoQuery { get; set; } 

    //Override with custom implementation 
    public object Any(DetailQuery query) 
    { 
     var q = AutoQuery.CreateQuery(query, base.Request); 
     return AutoQuery.Execute(request, q); 
    } 
} 

しかし、あなたが望むときにのみ、ということを行う必要があると思いますデフォルトの動作をカスタマイズする追加されたフィルタを人口に加えたSqlExpressionに追加します。

関連する問題