2013-12-22 81 views
0

我希望通過odata從實體集合中排除特定屬性。OData V3 exlude屬性

我用.Expand(「文件」)來檢索特定的集合,它們是數據庫中的文件,我想要文件的所有元數據(如Name和MimeType),但不是二進制文件本身。

我不允許更改OData服務本身,所以如果可能的話,它必須使用odata查詢中的指令完成。

有什麼想法? Thx提前。

UPDATE2:Vagif有幫助,但讓我意識到我沒有完全正確地說出我的問題。再一次:道歉。實際屬性可以位於通過展開「文件」返回的類中,但它必須爲空。換句話說:我希望擴展的子記錄有一個屬性沒有被填充數據。

更新:Thx nemesv。我的確應該更具體。 odata服務是使用使用c#的visual studio使用odata nuget包構建的。客戶端使用相同的工具。但是服務器使用odata 5.0.1。客戶端任何我想要的版本,(5.6現在我想)。

+1

你怎麼稱呼odata服務?哪個庫正在使用?使用url語法你的查詢應該看起來像這樣:'http:// localhost/odata/YourThings?$ expand = Files&$ select = YourProp,Files/Name,Files/MimeType' – nemesv

回答

0

如果使用C#和LINQ在客戶端,您可以選擇您要在有效載荷包括使用Select子句和匿名類型,例如屬性:

VAR的結果= context.MyCollection.Select(X => new {x.Name,x.Category});

UPDATE

與擴展實體選擇列訣竅是,你並不需要顯式地展開:WCF數據服務LINQ提供程序填充圖形出來。下面是使用羅斯文數據模型的例子:

[Test] 
public void SelectProductAndCategoryColumns() 
{ 
    var result = _context.Products 
     .Where(x => x.ProductID == 1) 
     .Select(x => new { x.ProductID, x.Category.CategoryID, x.Category.CategoryName }) 
     .Single(); 
    Assert.AreEqual(1, result.ProductID); 
    Assert.AreNotEqual(0, result.CategoryID); 
    Assert.IsNotNull(0, result.CategoryName); 
} 

注意,我在SELECT子句中鏈擴展列,而無需使用展開條款。它以這種方式工作(但只有一個級別,你不能進一步鏈接)。

+0

聽起來不錯,但我該怎麼做擴展路徑? var results = context.MyCollection.Expand(「Files」)。Select(x => new {x.Name,x.Files.Name}); ? –

+0

@GerbenRampaart,我已經更新了我的答案,希望它能幫助你建立正確的陳述。 –

+0

到目前爲止,您一直是一個巨大的幫助(尤其是在這種情況下我沒有使用Expand,但我不知道這一點),但請注意我的問題是排除一個屬性。此解決方案強制返回一個匿名函數,打破了我的延期鏈的語法。換句話說,並考慮你的例子,我想只排除「CategoryName」(或懶惰加載它,這並不重要)。因爲在我的場景中,我想懶加載我的BLOB屬性,它不能包含數據庫記錄中的字節。 (沒關係,如果該屬性仍然存在,但我希望它爲空) –