2009-07-04 16 views
19

Verschleiertes Szenario: Eine Person hat null, eins oder viele Haustiere.Typ IEnumerable kann nicht implizit konvertiert werden <T> zu IQueryable <T>

Mit Linq zu Sql, ist die Notwendigkeit, eine IQueryable Liste der Haustiere für die angegebene PersonID zu erhalten. Hier ist der schlecht verstümmelten/abgeschlachtet/verschleierte Teil des ERD:

alt text

Code:

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 
    } 

Ausnahme ausgelöst:

 
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?) 

fehlgeschlagen Att empts:

Angießen hat nicht funktioniert: .AsQueryable<MyType>()

Frage:

Wie können Sie die Ergebnisse der LinqToSql werfen (IQueryable<MyType>)

Aufruf Sammelmethode AsQueryable nicht funktioniert richtig auf IQueryable abfragen?

Antwort

44

Dies funktioniert für mich (mit verschiedenen Tabellen natürlich, aber gleicher Beziehung):

IQueryable<Pet> personPets = (
    from p in db.Person 
    where p.ID == somePersonID 
    select p 
).Single().Pets.AsQueryable(); 

Obwohl ich es wahrscheinlich in einigen Variationen dieser Art und Weise schreiben würde:

var personPets = 
    db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();  
1

Ich habe das Folgende und es funktioniert perfekt. Welche ich eine einfache Datenbank mit Ihren oben erwähnten zwei Tabellen gründete und die Datenklasse mit VS erzeuge.

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

Es ist wie ich aussieht, Ihre Person ist eigentlich die Klasse anstelle das Datenbankobjekt (standardmäßig durch den Codegenerator genannt ist). Testen Sie, ob das obige für Sie zuerst funktioniert, manchmal gibt der Debugger Ihnen vielleicht einen ausgeflippten Grund, der nicht auf das eigentliche Problem hinweist.

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

Versuchen Sie etwas wie das.

+0

Ich bevorzuge Diese Lösung hat mir gut getan! –

2

Blick auf Anfrage:

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

Was geschieht, ist, dass Sie eine IEnumerable zurückgeben (eines Elements) von IEntitySet<Pet> Typen (die Art: IEnumerable<IEntitySet<Pet>>).

Sie sollten eine IEnumerable<Pet> bekommen und es wird IQueryable<Pet> durch die AsQueryable Verfahren umgewandelt werden:

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

    return person.Pets.AsQueryable(); 
} 
1

was für mich, genug

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

seltsam

arbeitete
Verwandte Themen