无法转换IQueryable<>到IOrderedQueryable错误

时间:2009-11-13 22:12:58

标签: 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 = posts.Where(p => p.PostStatus.Id != 90);
        }

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

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

我不确定这意味着什么...... 为什么我会收到此错误?
一旦我将“orderby”子句添加到查询中,它之前就编译好了,所以我对所发生的事情有了一些预感,但我无法完全理解它。

2 个答案:

答案 0 :(得分:21)

尝试将posts专门声明为IQueryable<Post>而不是var(这将取消IOrderedQueryable<Post>(它仍将 订购)。

或者,重新构建它,以便我们在最后订购,允许我们(可选)在中间引入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>}

答案 1 :(得分:-6)

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

您可以使用

执行此操作
posts = posts.ToList().Where(p => p.PostStatus.Id != 90);