web-dev-qa-db-fra.com

Impossible de convertir implicitement le type IEnumerable <T> en IQueryable <T>

Scénario obscurci: Une personne a zéro, un ou plusieurs animaux.

En utilisant Linq to Sql, le besoin est d'obtenir une liste IQueryable d'animaux pour le personID donné. Voici la partie mal entravée/bouchée/obscurcie de la DRE:

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 levée:

 Impossible de convertir implicitement le type 
 'System.Collections.Generic.IEnumerable (System.Data.Linq.EntitySet (Pet))' 
 En 'System.Linq.IQueryable (Pet) '. 
 Une conversion explicite existe (il vous manque une distribution?) 

tentatives infructueuses:

La diffusion directe n'a pas fonctionné: (IQueryable<MyType>)

L'appel de la méthode de collecte AsQueryable n'a pas fonctionné: .AsQueryable<MyType>()

Question:

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

20
p.campbell

Cela fonctionne pour moi (avec différentes tables bien sûr, mais la même relation):

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

Bien que je l'écrirais probablement dans une variante de cette façon:

var personPets = 
    db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();    
45
Blorgbeard
List<Pet> personPets = 
   (from p in Persons
   where p.ID == somePersonID
   select p.Pets).ToList();

Essayez quelque chose comme ça.

2
Andrew Siemer

Regardez votre requête:

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

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

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

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

    return person.Pets.AsQueryable();
}
2
CMS

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;

curieusement

1
Hellola

J'ai les éléments suivants et cela fonctionne parfaitement. Que j'ai configuré une base de données simple avec vos deux tables mentionnées ci-dessus, et générer 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 me semble que 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). Testez 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 réellement vers le vrai problème.

1
xandy