我可以自定义.NET linq提供程序的oData URI格式转换吗?

时间:2011-08-08 20:47:00

标签: wcf linq odata

背景:

Linqpad(或VS2010中)的LINQ查询

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

转换为以下符合oData的URI:

http://localhost/OData.svc/EntityTypes(的 'http://富') (这是因为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'

我有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

不可能直接修改LINQ提供程序生成的URL,主要是因为URL生成过程没有公共挂钩。你显然可以从头开始编写一个,但这太过分了。