2

因此,我正在使用ServiceStack並且喜歡它提供的功能。我們已經到了需要實施可查詢數據API的地步......在我參加這個項目之前,已完成了一半的OData實施。我寧願不嘗試通過它來使其工作。需要自動查詢洞察

這把我帶到了AutoQuery。我想用我們的SQL Server數據庫來嘗試它。我在看http://docs.servicestack.net/autoquery-rdbms的例子 - 但我不能爲了我的生活得到這個工作。有什麼我在這裏失蹤?

我正在使用ORMLite來查詢SQL,並且我寫的集成測試表明它按照我的預期工作。我已經在容器中註冊了OrmLiteConnectionFactory,以及通過依賴注入方式使用它的存儲庫。

具體到代碼到目前爲止,我有一個類型,並基於QueryDb消息:

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,用我的服務:

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

隨着所有這一切,我能夠在管理界面中看到AutoQuery服務實例。當我使用查詢界面時,我打開了我的服務端點,並看到了我期望的數據 - 在「Div」和「Reg」集合中過濾值。我在這裏錯過了什麼「只是工作」?我在ServiceStack中完成了很多工作,從服務本身訪問我的存儲庫,但是我想了解一下AutoQuery在這裏提供的表格。我還沒有看到一個「直截了當」的例子,說明這是如何工作的......或者我正在尋找一個不在那裏的金罐?

回答

3

自動查詢工作with just the Request DTO即它不需要任何服務實現,讓您的查詢:

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

當從/report/detail稱爲將查詢Detail RDBMS表。但是這裏的屬性或者需要匹配Detail表中的列(例如DivReg)纔能有完全匹配(默認值),但是精確匹配通常不會用數組完成,而是使用標量值字符串,如:

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

如果你是querying a collection你會而不是讓一個IN查詢其中的值將包含值的列表,在這種情況下,他們通常使用複數:

public string[] Divs { get; set; } 
public string[] Regs { get; set; } 

並且可以用:

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

將執行類似的查詢:如果這不是你想要的,它需要匹配implicit convention,E行爲

SELECT * FROM Detail WHERE Div IN ('A','B') AND Rev IN ('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添加額外的過濾器。