【问题标题】:linq to sql ExecuteQuery() as IQueryablelinq to sql ExecuteQuery() as IQueryable
【发布时间】:2009-06-30 18:33:59
【问题描述】:

ExecuteQuery() 方法返回一个 IEnumerable,但有没有办法让它返回 IQueryable?

【问题讨论】:

    标签: linq linq-to-sql iqueryable


    【解决方案1】:

    好吧,你可以打电话给AsQueryable,但这不会有任何好处。问题在于,当您使用 ExecuteQuery 时,查询不是可组合,因为 LINQ to SQL 不能“理解”它。

    IQueryable<T> 的核心目的之一是允许将查询的各个方面组合在一起,然后 LINQ to SQL 可以将它们转换为单个 SQL 查询。当查询的某个位实际上是不透明的时,这将不起作用。

    【讨论】:

    • 你似乎明白我的确切问题。如果我想使用临时查询,有什么办法可以解决吗?
    • 据我所知,如果您想将它们用作其他查询的一部分,则不是。您可以编写一个存储过程并以可组合的方式调用 that,将 SQL 作为参数提供,但这会非常糟糕。
    • 这在理论上是否适用于skip and take 运算符?我知道它们不会被馈送到数据库中,但是底层的读者会只是抓住那些而不是将整个集合读入内存吗?
    • @Maslow:我不确定你的意思。但是,如果您说的是使用IEnumerable<T>,然后使用AsQueryable().Skip(...).Take(...),则不会将跳过/参加部分传递给数据库。
    • 对,但我的意思是底层SqlDbDataReader,在这种情况下跳过并采取帮助那个人吗?我想不会,因为每个 get next 都会将映射代码调用为真实类型,而且它是不可搜索的。或许通过处理/关闭阅读器而不是映射它们,在您跳过拍摄后所有项目都会增加?
    【解决方案2】:

    如果需要,您可以将查询结果导出到列表中,然后将其转换为 IQueryable。请参阅下一个示例代码:

    public IQueryable<Data> GetData()
        string query = @"select ...";
        object[] parameters = new object[...]{...};
        var resultQuery = this.DataContext.ExecuteQuery<SICDB.Data>(query, parameters);
        var tempList = resultQuery .ToList();
        return tempList.AsQueryable();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 2012-06-10
      • 1970-01-01
      • 2021-07-10
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多