代码之家  ›  专栏  ›  技术社区  ›  TomTom

对动态对象运行现有的linq查询(类似于datatable)

  •  2
  • TomTom  · 技术社区  · 16 年前

    我正在研究一个通用的odata提供程序,以与我们这里的自定义数据提供程序进行比较。thsi是完全动态的,因为我向数据提供程序查询它所知道的表。到目前为止,基于odata示例代码,我已经有了一个基本的存储结构。

    我的问题是:odata支持查询,并希望我提交一个iqueryable实现。在lowe rside上,我没有任何查询支持。不是玩笑-提供程序返回表,而where子句不受支持。这里性能不是问题-表很小。可以在odata提供者中对它们进行排序。

    我的主要问题是这个。

    • 我提交一个sql语句来获取表的数据。结果是这里出现了某种ADO.NET数据读取器。
    • 我需要为此数据公开一个IQueryable实现,以便以后可能进行筛选。

    有什么办法能最好地碰一下吗?仅限.NET 3.5(计划一段时间内不提供4.0)。我正在认真考虑为每个表创建动态DTO类(发出字节码),以便可以使用标准的LINQ。现在我使用的是每个条目的字典(效率不太高),但我看不到根据它们进行筛选/排序的真正方法。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Darrel Miller    16 年前

    odata背后的主要声音之一pablo castro说,在没有查询功能的情况下提供odata服务完全符合他们的意图。见 this 博客帖子。

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

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

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

        2
  •  1
  •   Vitek Karas MSFT    16 年前

    如果可以在OData提供程序中执行查询,只需将数据加载到T列表(T是实体的类型)中,然后简单地返回list.asqueryable()。这将返回一个linq to objects queryable,它提供对所有查询选项的完全支持,并基于内存中的存储(列表)。 请注意,要使此操作正常工作,您的IDataServiceQueryProvider.IsNullPropagationRequired必须返回true(因为Linq to objects要求通过查询正确传播null)。 另外,如果将canreflectioninstanceproperty anywhere设置为false,则需要重写一些查询。如果是这样的话,看看这个帖子 here 有关如何访问属性的说明。