لا يمكن تحويل iqueryable <> إلى خطأ
-
20-09-2019 - |
سؤال
لدي رمز 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);