【问题标题】:OData Linq problemOData Linq 问题
【发布时间】:2011-09-25 20:28:28
【问题描述】:

我创建了一个公开自托管 OData Web 服务的应用程序。 Web 服务公开了一组名为“Main”的对象。这些 Main 对象中的每一个都有一个对相关“详细信息”对象的引用,该对象非常大(许多属性,将近一百个)。

我现在使用 LinqPad 测试我的 Web 服务,它似乎工作正常。

我经常需要来自“主要”集合和相关“详细信息”对象的信息。这可以通过运行以下 linq 查询来完成:

 from m in Main.Expand( "Details" )
 where m.ID==57
 select m

这对应于网址:

 "http://MachineName:port/ServiceName/Main()?$filter=ID eq 57&$expand=Details"

此查询工作正常,并返回完整的 Main 对象和完整的相关 Details 对象。

但是,Details 对象非常大,通常我只需要两个对象中单个属性的值。

我可以手动构建一个 url,它给了我确切的信息:

 "http://MachineName/ServiceName/Main()?filter=ID eq 57&$expand=Details&$select=Property1,Details/Property2"

返回的 xml 仅包含 Main.Property1 的值和相关 Details.Property2 的值​​。

问题:为什么我不能创建一个 linq 查询呢?

当我尝试类似:

 from m in Main.Expand( "Details" )
 where m.ID == 57
 select new{ m.Property1, m.Details.Property2 }

它给了我一条错误消息:“NotSupportedException:在同一查询上指定了显式扩展时无法创建投影。”

我现在已经放弃使用 Linq 来构造查询。但是知道上面的正确 url,我如何直接在代码(C# 客户端)中使用该 url,然后如何访问结果?

【问题讨论】:

    标签: linq odata


    【解决方案1】:

    不只是

    from m in Main
    where m.ID == 57
    select new { m.Property1, m.Details.Property2 }
    

    为你工作?

    【讨论】:

    • 这对我也有用。不过有趣的是,在 OData 请求 URL 中省略了集合的扩展,而在该集合中选择一个字段时会给出:"Only properties specified in $expand can be traversed in $select query options. Selected item was 'BAlgemeen'."。检查 IQueryable 的 RequestUri 属性后发现 $expand=BAlgemeen 是在从中选择字段时自动添加的。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多