【问题标题】:Cannot convert IQueryable<> to IOrderedQueryable error无法将 IQueryable<> 转换为 IOrderedQueryable 错误
【发布时间】:2010-12-16 11:26:51
【问题描述】:

我有以下 LINQ 代码:

    var posts = (from p in db.Posts
         .Include("Site")
         .Include("PostStatus")
        where p.Public == false
        orderby p.PublicationTime 
        select p);

        if (!chkShowIgnored.Checked) {
            posts = posts.Where(p => p.PostStatus.Id != 90);
        }

最后一行(额外的 where)给了我错误:

无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IOrderedQueryable”。

我不确定这意味着什么...
为什么会出现此错误?
一旦我将“orderby”子句添加到查询中,它就会出现,在此之前它编译得很好,所以我对正在发生的事情有一种预感,但我不能完全投入其中。

【问题讨论】:

    标签: c# linq-to-sql type-conversion iqueryable iorderedqueryable


    【解决方案1】:

    尝试将posts 明确声明为IQueryable&lt;Post&gt; 而不是var(这将获取IOrderedQueryable&lt;Post&gt;(它仍将订购)。

    或者,重新构建它,以便我们在最后订购,允许我们(可选)在中间引入where

    var posts = from p in db.Posts
                 .Include("Site")
                 .Include("PostStatus")
                where p.Public == false
                select p);
    
    if (!chkShowIgnored.Checked) {
        posts = posts.Where(p => p.PostStatus.Id != 90);
    }
    var finalQuery = posts.OrderBy(p => p.PublicationTime);
    

    (很明显,我们看finalQuery

    出错的原因是您目前(基本上):

    IOrderedQueryable<Post> posts = {snip};
    ...
    posts = {something (Where) that returns IQueryable<Post>}
    

    【讨论】:

    • 两者都很有魅力,谢谢!你是什​​么意思我们在最后而不是在中间订购?一旦枚举查询,实际的SQL难道不是在这一切之后生成并执行的吗?我认为 LINQ 会足够聪明地“组合” WHERE...
    • 是 OrderBy 改变了签名...通过使 OrderBy 成为我们应用的最后一件事,我们始终拥有IQueryable&lt;T&gt;,这更容易编写。正如您所说,提供程序(EF、LINQ-to-SQL 等)无论如何都会在执行之前合并所有内容。
    • 啊啊啊,最后的解释非常清楚,明白了。谢谢!!
    【解决方案2】:

    lambda 表达式的结果是 IQueryable 类型的。它不允许扩展方法 Where,因此要首先使用它,您必须将其转换为例如列表。

    你可以这样做

    posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
    

    【讨论】:

    • Hmmmmm,但这不是先执行一个查询,从数据库中获取所有记录,然后在 ASP.Net 中按状态过滤它们吗?我宁愿让数据库处理所有 WHERE,这就是我认为如果我只是添加 .Where 子句就会发生的事情,因为稍后会在枚举结果时生成并执行 SQL。在您的情况下, ToList() 不会导致它也被执行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多