-
29-09-2019 - |
سؤال
لديّ func محددة على النحو التالي:
Func<Foo, bool> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;
يمكنني الاستعلام عن مواقف Ienumerables مثل هذا:
IEnumerable<Foo> foos = GetAllMyFoos();
var superFoos = foos.Where(IsSuperhero);
لكن عندما أحاول تزويد نفس الفانك بأسلوب مكان equeryable ، أحصل على:
"لا يمكن تحويل نوع المصدر system.collections.generic.ienumeries إلى system.linq.iqueryable."
ماذا يحدث هنا؟ كيف يمكنني تحديد func والتي ستعمل كمواصفات لكل من ienumerable و iqueryable؟
المحلول
IQueryable
أساليب LINQ تأخذ أشجار التعبير, ، وليس المندوبين العاديين.
لذلك ، تحتاج إلى تغيير الخاص بك func
متغير إلى Expression<Func<Foo, bool>>
, ، مثله:
Expression<Func<Foo, bool>> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;
لاستخدام نفس المتغير مع IEnumerable<T>
, ، ستحتاج إلى الاتصال AsQueryable()
أو Compile()
, ، مثله:
IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());
لا تنتمي إلى StackOverflow