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:
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
?
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();
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
Essayez quelque chose comme ça.
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();
}
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
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.