سؤال

لديّ 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());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top