2

我正在开发一个通用 OData 提供程序,以对抗我们在这里拥有的自定义数据提供程序。Thsi 是完全动态的,因为我向数据提供者查询它知道的表。到目前为止,我有一个基于 OData 示例代码的基本存储结构。

我的问题是:OData 支持查询并希望我提交 IQueryable 实现。在低端,我没有任何查询支持。不是开玩笑 - 提供者返回表并且不支持 WHERE 子句。性能在这里不是问题 - 表很小。可以在 OData 提供程序中对它们进行排序。

我的主要问题是这个。

  • 我提交了一条 SQL 语句来获取表中的数据。结果是某种 ADO.NET 数据阅读器。
  • 我需要为这些数据公开一个 IQueryable 实现,以便以后过滤。

知道如何最好地触摸它吗?仅 .NET 3.5(一段时间未计划 4.0)。我正在认真考虑为每个表(发出字节码)创建动态 DTO 类,以便我可以使用标准 LINQ。现在我每个条目都使用一个字典(效率不太高),但我看不到基于它们进行过滤/排序的真正方法。

4

2 回答 2

1

如果您可以在 OData 提供程序中执行查询,您可以简单地将数据加载到 T 的列表中(T 是实体的类型),然后简单地返回 list.AsQueryable()。这将返回一个可查询的 LINQ to Objects,它提供对所有查询选项的完全支持,并且基于内存中的存储(列表)。请注意,要使其正常工作,您的 IDataServiceQueryProvider.IsNullPropagationRequired 必须返回 true(因为 LINQ to Objects 需要通过查询正确传播空值)。此外,如果您将 CanReflectOnInstanceProperty 任何地方设置为 false,您将需要进行一些查询重写。如果是这种情况,请查看此处的这篇文章,了解如何访问属性。

于 2010-04-27T19:45:22.923 回答
0

OData 背后的主要声音之一 Pablo Castro 表示,在没有查询功能的情况下提供 OData 服务完全符合他们的意图。请参阅博客文章。

这是我真正希望他们在 OData 响应中实现“搜索”链接的原因之一,以便客户端应用程序可以确定查询功能是否可用。像 OpenSearch 之类的东西。

<Link rel="search" type="application/ODataQuery+xml" href="QueryMetadata.xml"/>

这样,客户可以轻松地发现搜索是否实现。

于 2010-03-22T12:40:41.197 回答