我想知道是否可以對特定的數組元素進行過濾。 我知道有可能過濾嵌套屬性並對集合應用任何/所有函數,但沒有找到任何有關如何過濾集合上特定索引的文檔。 作爲一個例子(在LINQ的表示):數組元素上的數據過濾器
data.Where(d => d.Proposals [0] == .Growth.Value0.05米)
我期待一個語法像:
$濾波器=建議(0)/生長/值當量0.05M
我想知道是否可以對特定的數組元素進行過濾。 我知道有可能過濾嵌套屬性並對集合應用任何/所有函數,但沒有找到任何有關如何過濾集合上特定索引的文檔。 作爲一個例子(在LINQ的表示):數組元素上的數據過濾器
data.Where(d => d.Proposals [0] == .Growth.Value0.05米)
我期待一個語法像:
$濾波器=建議(0)/生長/值當量0.05M
的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
中定義函數。 (爲了測試,我定義了一個名爲AllZebras
Zebra
實例的靜態列表。)
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)
感謝您的詳細解答。其實我需要用通用的方式表達過濾請求,我不能在服務器端實現特定的過濾。我的意思是請求將由客戶端網格根據顯示的列生成,這些列是複雜對象(包括數組)的投影。我可以有另一個列引用像Proposals [1] .AnotherArray [2] .Amount.Value這樣的路徑。所以,我正在尋找一個標準的和通用的syntaxt來表達OData查詢中的路徑。 – enenkey
嗯。我很好奇你是如何爲陣列建模的。你的$元數據文件是什麼樣的? – lencharest