【问题标题】:Running an existing LINQ query against a dynamic object (DataTable like)针对动态对象运行现有的 LINQ 查询(类似 DataTable)
【发布时间】:2010-03-22 08:59:01
【问题描述】:

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

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

我的主要问题是这个。

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

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

【问题讨论】:

  • 如果你没有对象(或结构)来询问谓词,你想如何使用过滤。据我所知,您需要提供 IQuerable 的实现。这样您就可以将表达式转换为过滤结果集的委托。
  • 从技术上讲,我暂时不运行任何过滤并忽略它是完全可以的;) 暴露了许多表,它们基本上用于填充下拉列表 - 以及一些“存储过程” " 无论如何都会在逻辑中进行过滤。

标签: linq wcf-data-services odata astoria


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2019-07-30
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多