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);
        }

その最後の行(余分な場所)は私にエラーを与えています:

タイプ 'System.Linq.IQueryable' を 'System.Linq.IOrderedQueryable' に暗黙的に変換することはできません。

これが何を意味するのかよくわかりません...
なぜこのエラーが発生するのですか?
「orderby」句をクエリに追加すると表示されましたが、それ以前は正常にコンパイルされていたので、何が起こっているのかの予感はありますが、指を入れることはできません。

4

2 に答える 2

30

ではなく、posts具体的に宣言してみてくださいIQueryable<Post>varIOrderedQueryable<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

ラムダ式の結果は IQueryable 型です。拡張メソッド Where は許可されていないため、最初にこれを使用するには、これをたとえばリストに変換する必要があります。

を使用してこれを行うことができます

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