我正在开发一个通用的OData提供程序,以反对我们在这里提供的自定义数据提供程序。 Thsi是完全动态的,因为我在数据提供程序中查询它知道的表。到目前为止,基于OData示例代码,我有一个基本的存储结构。
我的问题是:OData支持查询,并希望我提交一个IQueryable实现。在下面,我没有任何查询支持。不是笑话 - 提供者返回表并且不支持WHERE子句。性能不是问题 - 表格很小。可以在OData提供程序中对它们进行排序。
我的主要问题是这个。
任何想要最好接触的想法啊?仅限.NET 3.5(计划在一段时间内没有4.0)。我正在认真考虑为每个表创建动态DTO类(发出字节码),所以我可以使用标准的LINQ。现在我每个条目使用一个字典(效率不高),但我认为没有真正的方法来过滤/排序。
答案 0 :(得分:1)
如果您可以在OData提供程序中执行查询,只需将数据加载到T列表中(T是实体的类型),然后只返回list.AsQueryable()。这将返回LINQ to Objects queryable,它提供对所有查询选项的完全支持,并基于内存存储(列表)。 请注意,要使其正常工作,您的IDataServiceQueryProvider.IsNullPropagationRequired必须返回true(因为LINQ to Objects需要通过查询正确传播空值)。 此外,如果将CanReflectOnInstanceProperty设置为false,则需要进行一些查询重写。如果是这种情况,请查看这篇文章here,了解如何访问属性。
答案 1 :(得分:0)
Pablo Castro,OData背后的主要声音之一表示,提供没有查询功能的OData服务完全符合他们的意图。请参阅this博文。
这是我真的希望他们在OData响应中实现“搜索”链接的原因之一,以便客户端应用程序可以确定查询功能是否可用。像OpenSearch这样的东西。
<Link rel="search" type="application/ODataQuery+xml" href="QueryMetadata.xml"/>
这样,客户可以轻松发现是否实施了搜索。