【问题标题】:Can I customize the .NET linq provider's translation to oData URI format?我可以自定义 .NET linq 提供程序到 oData URI 格式的转换吗?
【发布时间】:2011-08-08 20:46:59
【问题描述】:

背景:

Linqpad 中的这个 LINQ 查询(或者在 VS2010 中)

EntityTypes.Where(x => x.EntityUrn == "http://foo")

转换为以下符合 oData 的 URI:

http://localhost/OData.svc/EntityTypes('http://foo') (这是因为 EntityUrn 是实体键...如果我的 Linq 查询指定了任何其他字段,则使用 $filter 语法)

问题在于,由于实体密钥中的字符受限,此 oData URI 返回错误(请参阅 blogs.msdn.com/b/peter_qian/archive/2010/05/25/using-wcf-data-service-with -restricted-characrters-as-keys.aspx)

所以我想做的是让这个 LINQ 查询自动转换为这个等效的 oData 兼容 URI:

http://localhost/OData.svc/EntityTypes?$filter=EntityUrn eq 'http://foo'

有什么建议吗?

【问题讨论】:

  • 即使这样有效,您的 OData 服务也不符合标准。
  • #1 - 此请求如何违反 OData 标准? localhost/OData.svc/EntityTypes?$filter=EntityUrn eq 'foo' #2 - 真的可以操纵 LINQ>OData URI 转换逻辑吗?
  • #1:使用$filter 很好。但是您将能够通过 ID 处理查询。 #2 我想你可以,但我不记得怎么做了。

标签: wcf linq odata


【解决方案1】:

如上所述,即使您解决了手头的问题,更大的问题仍然存在,那就是您的实体无法通过其编辑/自我链接进行寻址。这意味着您将无法在查询 (/Customer(0)/Orders) 中使用导航,并且您的服务将无法接受对其实体的任何 PUT/DELETE 请求。 因此,如果可能的话,我会将模型更改为不使用 URL 作为关键属性。而是使用一些可以作为 URI 路径段的一部分的值。

无法直接修改 LINQ 提供程序生成的 URL,主要是因为 URL 生成过程中没有公共挂钩。显然你可以从头开始写一个,但那工作量太大了。

【讨论】:

  • Vitek,我将回到本文中 Peter Qian 的建议:blogs.msdn.com/b/peter_qian/archive/2010/05/25/... 建议的解决方法 : 确实有效。但是,建议的 / 修复没有任何效果。有什么建议么?
  • 如果可能的话,我仍然会尝试使用不包含这些特殊字符的键值。您必须跳过钩子才能使它们起作用(即使它确实起作用)这一事实是一个字符串信号,表明这样做通常不是一个好主意。
  • 如果您仍然需要这样做,请发布另一个关于启用您的服务器(我假设是 IIS)处理此类 URL 的问题。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 2021-07-19
  • 2012-02-16
  • 1970-01-01
  • 2011-08-04
  • 2021-12-18
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多