1

我試圖更改自動查詢使用或(它是搜索框搜索許多領域)上的幾個字段。儘管根據它應該的文檔,這似乎不起作用。ServiceStack自動查詢和字段或

public class PropertyGet : QueryDb<DomainModel.Property> 
{ 
    [QueryDbField(Term=QueryTerm.Or)] 
    public string NameContains { get; set; } 

    [QueryDbField(Term=QueryTerm.Or)] 
    public string CityContains {get;set;} 
} 

但是這並不:

[QueryDb(QueryTerm.Or)] 
public class PropertyGet : QueryDb<DomainModel.Property> 
    { 
     public string NameContains { get; set; } 
     public string CityContains {get;set;} 
    } 

更改查詢行爲

默認查詢用作過濾器和每一個條件結合 和布爾詞來進一步篩選result-組。這可以改變 通過指定 期限= QueryTerm.Or改性劑,e.g在字段級使用一個OR:

[QueryDbField(期限= QueryTerm.Or)] 公共字符串名字{得到;組; }

我該如何做字段級別或查詢?

+0

你是什麼意思的「字段級別或查詢」?第一個查詢需要是WHERE語句中的過濾器。你希望生成什麼SQL? – mythz

+0

我只是試圖基於或者而不是和過濾。在我的情況下,名稱包含或城市包含。會有其他領域將有'和'條件。在我開始接觸條件之前,我期待着第一個案例的工作。 – lucuma

+0

這與劍道網格有關。這些列是可過濾的(AND),並且網格上方有一個搜索框,我想在同一個自動查詢中生成一組OR條件。 – lucuma

回答

1

問題是由於使用[QueryDbField]依賴於一個implicit convention,如「%含有」:

public class PropertyGet : QueryDb<DomainModel.Property> 
{ 
    [QueryDbField(Term=QueryTerm.Or)] 
    public string NameContains { get; set; } 

    [QueryDbField(Term=QueryTerm.Or)] 
    public string CityContains {get;set;} 
} 

使用[QueryDbField]當你想要在覆蓋隱含約定。我已更改this commit中的行爲,現在它將[QueryDbField]和匹配的隱式約定的行爲合併,現在您的查詢現在應按預期工作。

此更改從v4.5.7 +現在可以獲得available on MyGet

+0

我能得到這個工作的唯一方法是通過指定整個db字段定義'[QueryDbField(Field =「Name」,Template =「{Field} LIKE {Value}」,ValueFormat =「%{0}%」, Term = QueryTerm.Or)]'只需添加'QueryTerm.Or'對我來說不起作用 – lucuma

+0

@lucuma哦,你的意思是把行爲改爲Contains,是的,如果你提供你自己的[QueryDbField]重新接管行爲並需要將其從默認的'='行爲改變。我會看看是否容易保留隱式慣例行爲。 – mythz

+0

我的文章中的第一個例子應該如何工作? – lucuma