2009-07-04 7 views
19

Scénario obscur: Une personne a zéro, un ou plusieurs animaux domestiques.Impossible de convertir implicitement le type IEnumerable <T> en IQueryable <T>

En utilisant Linq à Sql, le besoin est d'obtenir une liste d'animaux de compagnie pour le personID donné. est ici la mauvaise partie mutilée/égorgés/obscurcie de l'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 
    } 

Exception Raised:

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

Échec Att empts:

coulée directe ne fonctionne pas: (IQueryable<MyType>)

Appel de la méthode de collecte AsQueryable ne fonctionne pas: .AsQueryable<MyType>()

Question:

Comment pouvez-vous jeter les résultats de la LinqToSql requête correctement à IQueryable?

Répondre

44

Cela fonctionne pour moi (avec des tables bien sûr, mais même relation):

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

Bien que je serais probablement écrire dans une variante de cette façon:

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

Je ce qui suit et cela fonctionne parfaitement. Ce que je configure une base de données simple avec vos deux tables mentionnées ci-dessus, et génère la classe de données avec VS.

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

Il ressemble à moi, votre personne est en fait la classe au lieu de l'objet de base de données (qui est par défaut nommé par le générateur de code). Tester si ce qui précède fonctionne pour vous en premier, parfois le débogueur peut simplement vous donner une raison bizarre qui ne pointe pas vraiment sur le vrai problème.

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

Essayez quelque chose comme ceci.

+0

Je préfère rred cette solution, a bien fonctionné pour moi! –

2

Regardez votre requête:

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

Ce qui se passe est que vous retournez un IEnumerable (d'un élément) de IEntitySet<Pet> types (type: IEnumerable<IEntitySet<Pet>>).

Vous devriez obtenir un IEnumerable<Pet> et il sera converti en IQueryable<Pet> par la AsQueryable méthode:

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

    return person.Pets.AsQueryable(); 
} 
1

ce qui a fonctionné pour moi,

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

étrangement

Questions connexes