C# 无法转换IQueryable<&燃气轮机;要删除可查询的错误,请执行以下操作:

C# 无法转换IQueryable<&燃气轮机;要删除可查询的错误,请执行以下操作:,c#,linq-to-sql,type-conversion,iqueryable,iorderedqueryable,C#,Linq To Sql,Type Conversion,Iqueryable,Iorderedqueryable,我有以下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

我有以下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”子句添加到查询中之后,它就出现了,在此之前,它编译得很好,因此我对正在发生的事情有某种预感,但我不能完全投入其中。

类型IQueryable的lambda表现主义的结果。它不允许在何处使用扩展方法,因此首先必须将其转换为列表

你可以使用

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

尝试将
posts
具体声明为
IQueryable
而不是
var
(这将拾取
IOrderedQueryable
(仍将排序)

或者,重新构造它,以便我们在末尾下单,允许我们(可选)在中间引入
,其中

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 posts={snip};
...
posts={something(Where)返回IQueryable}

Hmmmmm,但这不是首先执行一个查询,从数据库中获取所有记录,然后在ASP.Net中按状态筛选它们吗?我宁愿让DB处理所有Where,如果我只是添加了.Where子句,我想会发生这种情况,因为SQL将在稍后枚举结果时生成并执行UR的情况下,它也不会导致它被执行吗?两个都像一个符咒,谢谢!你的意思是我们在最后而不是在中间进行排序?在所有这些之后,实际的SQL不是生成和执行的吗?一旦查询被枚举了,我猜想LINQ会足够聪明地“结合”。WHEREs…是OrderBy更改了签名…通过将OrderBy作为我们应用的最后一个对象,我们有了
IQueryable
,这更容易编写。正如您所说,提供者(EF、LINQ to SQL等)将在执行之前合并所有内容。啊,最终的解释非常清楚,明白了。谢谢!!
IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}