2009-11-13 11 views
10

için IQueryable <> dönüştürülemez Aşağıdaki LINQ kodu vardır:IOrderedQueryable hatası

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

Bu son satırı (burada ekstra) bana hata veriyor:

dolaylı tip 'Sistemini dönüştürülemez. Linq.IQueryable 'ila' System.Linq.IOrderedQueryable '.

Bunun ne anlama geldiğinden emin değilim ...
Neden bu hatayı alıyorum?
Sorguya "orderby" tümceyi ekledikten sonra, iyi bir derleme yapmadan önce göründü, bu yüzden neler olup bittiğini anladım, ama parmağımı içine koyamıyorum.

cevap

19

bildirmeyi deneyin kullanarak bu yapabilirdi posts özellikle ziyade var (Alternatif olarak IOrderedQueryable<Post> (hala ) sıralanacaktır.

gelip alacak olan yeniden IQueryable<Post> olarak Sonunda, where ürününü ortada getirerek (isteğe bağlı olarak) bize sipariş verdiğimiz şekilde yapılandırın:

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

(besbelli, biz finalQuery bakmak)

o erroring olduğu nedenidir şu anda (aslında) sahip olduğu:

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

Her ikisi de bir çekicilik gibi çalıştı, teşekkürler! Ne demek istiyorsun ortada değil, sonunda sipariş veriyoruz? Sorgu numaralandırıldıktan sonra gerçek SQL tüm bunlar üretilip çalıştırılmıyor mu? LINQ, WHERE'leri "birleştirmek" için yeterince akıllı olacağını düşünmüştüm ... –

+5

Satın aldığımız son şeyi OrderBy yaparak, imzayı değiştiren OrderBy, daha kolay olan "IQueryable " seçeneğine sahibiz. oluşturmak için. Söylediğiniz gibi, sağlayıcı (EF, LINQ-to-SQL vb.), Her halükarda yürütmeden önce her şeyi birleştirecektir. –

+0

Aaaaah, bu son açıklama SUPER clear, gotcha. Teşekkür ederim!! –

-5

IQueryable türü lambda ifadelerinin sonucu. Uzantı yöntemine izin vermiyor Nerede, ilk önce bunu kullanmak için, örneğin bir listeye dönüştürmelisiniz.

Sen

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

Hmmmmm, ama bu ilk olacak bir sorgu çalıştırmayacak Tüm kayıtları veritabanından getirip ASP.Net'de duruma göre filtreleyin? DB işlemini tüm WHERE'lere sahip olmayı tercih ederim. Bu, sonuçların numaralandırılmasından sonra SQL'in üretilip çalıştırılacağından, .Where maddesini eklediysem ne olduğunu düşündüğüm şeydi. Senin durumunda, ToList() onun da idam edilmesine neden olmaz mı? –