16

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

4

2 回答 2

30

尝试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>}
于 2009-11-13T22:21:10.073 回答
-6

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

你可以这样做使用

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
于 2009-11-13T22:16:27.397 回答