2010-03-22 43 views
2

我正在使用通用的OData提供程序来对付我们在此处定制的数据提供程序。这是完全动态的,因为我查询它知道的表的数据提供者。基于OData示例代码,我有一个基本的存储结构。针对动态对象运行现有的LINQ查询(DataTable like)

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

我的主要问题是这样的。

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

任何ide ahow最好的接触呢?仅限.NET 3.5(计划一段时间没有4.0)。我正在认真考虑为每个表创建动态的DTO类(发送字节码),所以我可以使用标准的LINQ。现在,我为每个条目使用一个字典(不是太高效),但是我没有看到根据它们进行过滤/排序的真正方法。

+0

如果您没有对象(或结构体)来询问谓词,您希望如何使用过滤。 据我所见你需要提供IQuerable的实现。以便将表达式转换为过滤结果集的代表。 – luckyluke 2010-03-22 09:14:30

+0

从技术上讲,我完全没问题,暂时不运行任何过滤并忽略它;)有许多基本上用于填充下拉列表的表格 - 以及一些在逻辑中进行过滤的“存储过程”无论如何。 – TomTom 2010-03-22 09:36:47

回答

0

Pablo Castro是OData背后的主要声音之一,他表示在没有查询能力的情况下提供OData服务在他们的意图内是完全一致的。见this博客文章。

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

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

这样,客户端可以很容易地发现搜索是否实现。

1

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