سؤال

لدي رمز 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" إلى الاستعلام، قبل ذلك جمعت بشكل جيد، لذلك لدي نوع من حدبة ما يجري، لكنني لا أستطيع وضع إصبعي في ذلك تماما.

هل كانت مفيدة؟

المحلول

حاول الإعلان 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>}

نصائح أخرى

نتيجة لتعبير Lambda من النوع Iqueryable. لا يسمح بطريقة التمديد حيث، لذلك يجب استخدامه أولا يجب عليك تحويل هذا إلى، على سبيل المثال، قائمة.

يمكنك القيام بذلك باستخدام

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top