لا يمكن تحويل النوع IEnumerable<T> ضمنيًا إلى IQueryable<T>
-
22-08-2019 - |
سؤال
السيناريو المبهم:ليس لدى الشخص صفر أو حيوان أليف واحد أو أكثر.
باستخدام Linq إلى Sql، هناك حاجة إلى الحصول على ملف IQueryable
قائمة الحيوانات الأليفة لشخص معين.إليك الجزء المشوه/المذبوح/المبهم من ERD:
شفرة:
public IQueryable<Pet> GetPersonPets(int personID)
{
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
return personPets; //fail
// return (IQueryable<Pet>)personPets //also fail
// return personPets.AsQueryable<Pet>() //also fail
}
الاستثناء المرفوع:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable (System.Data.Linq.EntitySet(Pet))' to 'System.Linq.IQueryable(Pet)'. An explicit conversion exists (are you missing a cast?)
محاولات فاشلة:
لم ينجح الصب المباشر: (IQueryable<MyType>)
طريقة جمع الدعوة AsQueryable
لم تنجح: .AsQueryable<MyType>()
سؤال:
كيف يمكنك إرسال نتائج استعلام LinqToSql بشكل صحيح إلى IQueryable
?
المحلول
هذا يناسبني (مع جداول مختلفة بالطبع، ولكن نفس العلاقة):
IQueryable<Pet> personPets = (
from p in db.Person
where p.ID == somePersonID
select p
).Single().Pets.AsQueryable();
على الرغم من أنني ربما سأكتبها بطريقة ما بهذه الطريقة:
var personPets =
db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();
نصائح أخرى
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
جرب شيئا من هذا القبيل.
انظر إلى استفسارك:
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
ما يحدث هو أنك تقوم بإرجاع IEnumerable (من عنصر واحد) من IEntitySet<Pet>
أنواع (النوع: IEnumerable<IEntitySet<Pet>>
).
يجب أن تحصل على IEnumerable<Pet>
وسيتم تحويله إلى IQueryable<Pet>
بواسطة AsQueryable
طريقة:
public IQueryable<Pet> GetPersonPets(int personID)
{
var person = Person.Single(p=> p.ID == personID);
return person.Pets.AsQueryable();
}
لدي ما يلي ويعمل بشكل مثالي.حيث أقوم بإعداد قاعدة بيانات بسيطة باستخدام الجدولين المذكورين أعلاه، وإنشاء فئة البيانات باستخدام VS.
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
يبدو لي أن شخصك هو في الواقع فصل بدلاً من كائن قاعدة البيانات (الذي يتم تسميته بشكل افتراضي بواسطة منشئ التعليمات البرمجية).اختبر ما إذا كان ما سبق يناسبك أولاً، ففي بعض الأحيان قد يعطيك مصحح الأخطاء ببساطة سببًا غريبًا لا يشير في الواقع إلى المشكلة الحقيقية.
ما عملت بالنسبة لي،
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
غريب كفاية