针对动态对象运行现有LINQ查询(类似DataTable)

时间:2010-03-22 08:59:01

标签: linq wcf-data-services odata astoria

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

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

我的主要问题是这个。

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

任何想要最好接触的想法啊?仅限.NET 3.5(计划在一段时间内没有4.0)。我正在认真考虑为每个表创建动态DTO类(发出字节码),所以我可以使用标准的LINQ。现在我每个条目使用一个字典(效率不高),但我认为没有真正的方法来过滤/排序。

2 个答案:

答案 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"/>

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