2009-07-04 12 views
19

अस्पष्ट परिदृश्य: एक व्यक्ति शून्य, एक या कई पालतू जानवर है।परोक्ष कनवर्ट नहीं कर सकता प्रकार IEnumerable <T> IQueryable को <T>

Sql को LINQ का उपयोग, जरूरत को देखते हुए personID के लिए पालतू जानवर के IQueryable सूची प्राप्त करने के लिए है। यहाँ खराब घायल/butchered/अस्पष्ट 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?) 

विफल Att empts:

प्रत्यक्ष कास्टिंग काम नहीं किया: (IQueryable<MyType>)

संग्रह विधि AsQueryable कॉलिंग काम नहीं किया: .AsQueryable<MyType>()

प्रश्न:

कैसे आप LinqToSql के परिणाम डाल सकता IQueryable पर ठीक से पूछताछ करें?

उत्तर

44

यह मेरे लिए काम करता है (बेशक अलग-अलग तालिकाओं, लेकिन एक ही रिश्ते के साथ):

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();  
1

मेरे पास है निम्नलिखित और यह पूरी तरह से काम करता है। जो मैंने आपके उपर्युक्त दो तालिकाओं के साथ एक सरल डेटाबेस स्थापित किया है, और वीएस के साथ डेटाकलास उत्पन्न किया है।

var db = new DataClasses1DataContext(); 
var personPets = from p in db.Persons 
       where p.PersonId == 1 
       select p.Pet; 

यह मेरे लिए की तरह लग रहा है, अपने व्यक्ति वास्तव में कक्षा के बजाय डेटाबेस वस्तु (जो कोड जनरेटर द्वारा नाम डिफ़ॉल्ट रूप से है)। परीक्षण करें कि उपरोक्त आपके लिए पहले काम करता है, कभी-कभी डीबगर आपको कुछ अजीब कारण दे सकता है जो वास्तव में वास्तविक समस्या को इंगित नहीं कर रहा है।

2
List<Pet> personPets = 
    (from p in Persons 
    where p.ID == somePersonID 
    select p.Pets).ToList(); 

ऐसा कुछ करने का प्रयास करें। आपकी क्वेरी में

+0

मैं prefe इस समाधान को झुकाया, मेरे लिए बहुत अच्छा काम किया! –

2

देखो:

var personPets= from p in Person 
    where p.ID == somePersonID 
    select p.Pets; 

क्या हो रहा है कि आप IEntitySet<Pet> प्रकार के (एक तत्व की) एक IEnumerable लौट रहे है (प्रकार: IEnumerable<IEntitySet<Pet>>)।

आप एक IEnumerable<Pet> मिलना चाहिए और यह AsQueryable विधि द्वारा IQueryable<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; 

अजीब पर्याप्त

public IQueryable<Pet> GetPersonPets(int personID) 
{ 
    var person = Person.Single(p=> p.ID == personID); 

    return person.Pets.AsQueryable(); 
} 
संबंधित मुद्दे