linq - No se puede convertir implícitamente el tipo IEnumerable<T> a IQueryable<T>
linq-to-sql collections (5)
Escenario ofuscado : una persona tiene cero, una o muchas mascotas.
Usando Linq to Sql, la necesidad es obtener una lista de mascotas IQueryable para el ID de persona dado. Aquí está la parte maltratada / destrozada / ofuscada de la ERD:
Código:
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
}
Excepción planteada:
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?)
Intentos fallidos :
El casting directo no funcionó: (IQueryable<MyType>)
El método de recopilación de llamadas AsQueryable
no funcionó: .AsQueryable<MyType>()
Pregunta :
¿Cómo puede convertir los resultados de la consulta LinqToSql correctamente a IQueryable
?
Esto me funciona (con diferentes tablas, por supuesto, pero con la misma relación):
IQueryable<Pet> personPets = (
from p in db.Person
where p.ID == somePersonID
select p
).Single().Pets.AsQueryable();
Aunque probablemente lo escribiría en alguna variación de esta manera:
var personPets =
db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();
Mira tu consulta:
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
Lo que ocurre es que está devolviendo un IEnumerable (de un elemento) de los IEntitySet<Pet>
(el tipo: IEnumerable<IEntitySet<Pet>>
).
Debería obtener un IEnumerable<Pet>
IQueryable<Pet>
y se convertirá a IQueryable<Pet>
AsQueryable
mediante el método AsQueryable
:
public IQueryable<Pet> GetPersonPets(int personID)
{
var person = Person.Single(p=> p.ID == personID);
return person.Pets.AsQueryable();
}
Tengo lo siguiente y funciona perfectamente. Que configuro una base de datos simple con las dos tablas mencionadas anteriormente y genero la clase de datos con VS.
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
A mí me parece que su Persona es en realidad la Clase en lugar del objeto de la base de datos (que por defecto es nombrado por el generador de código). Prueba si lo anterior funciona para ti primero, a veces el depurador simplemente te puede dar alguna razón extraña que no apunta al problema real.
lo que funciono para mi
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
Curiosamente
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
Intenta algo como esto.