2015-12-24 23 views
0

我想知道是否可以對特定的數組元素進行過濾。 我知道有可能過濾嵌套屬性並對集合應用任何/所有函數,但沒有找到任何有關如何過濾集合上特定索引的文檔。 作爲一個例子(在LINQ的表示):數組元素上的數據過濾器

data.Where(d => d.Proposals [0] == .Growth.Value0.05米)

我期待一個語法像:

$濾波器=建議(0)/生長/值當量0.05M

回答

2

的OData是基於實體數據模型,它不支持有序集合(芳射線)。所以沒有內置的按位置過濾的語法。

如果您的目標是使用客戶端提供的值對缺省Growth/Value進行篩選,則可以使用OData函數實現該目標。在您的Web API配置中聲明該函數。

// builder is an instance of ODataConventionModelBuilder 
var defaultGrowthValueFunction = builder.EntityType<Zebra>().Collection.Function("WhereGrowthEquals"); 
defaultGrowthValueFunction.Parameter<decimal>("value"); 
defaultGrowthValueFunction.ReturnsCollectionFromEntitySet<Zebra>("Zebras"); 

功能被命名爲WhereGrowthEquals,並將其綁定到Zebras實體集。 (我發明了一個名爲Zebra的實體類型,以便從上例中託管Proposals陣列。)

現在在ZebrasController中定義函數。 (爲了測試,我定義了一個名爲AllZebrasZebra實例的靜態列表。)

public class ZebrasController : ODataController 
{ 
    [HttpGet] 
    [ODataRoute("Zebras/Default.WhereGrowthEquals(value={value})")] 
    public IHttpActionResult WhereGrowthEquals(decimal value) 
    { 
     return this.Ok(AllZebras.Where(z => z.Proposals[0].Growth.Value == value)); 
    } 
} 

注意綁定功能是名稱空間限定在ODataRoute屬性。 (Default是默認名稱空間名稱。)

最後,從客戶端調用函數,如下所示。

GET http://hostname/Zebras/Default.WhereGrowthEquals(value=0.05) 
+0

感謝您的詳細解答。其實我需要用通用的方式表達過濾請求,我不能在服務器端實現特定的過濾。我的意思是請求將由客戶端網格根據顯示的列生成,這些列是複雜對象(包括數組)的投影。我可以有另一個列引用像Proposals [1] .AnotherArray [2] .Amount.Value這樣的路徑。所以,我正在尋找一個標準的和通用的syntaxt來表達OData查詢中的路徑。 – enenkey

+0

嗯。我很好奇你是如何爲陣列建模的。你的$元數據文件是什麼樣的? – lencharest