2013-12-22 43 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属性,它不能包含数据库记录中的字节。 (没关系,如果该属性仍然存在,但我希望它为空) –