سؤال

السيناريو المبهم:ليس لدى الشخص صفر أو حيوان أليف واحد أو أكثر.

باستخدام Linq إلى Sql، هناك حاجة إلى الحصول على ملف IQueryable قائمة الحيوانات الأليفة لشخص معين.إليك الجزء المشوه/المذبوح/المبهم من ERD:

alt text

شفرة:

 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;

غريب كفاية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top