linq linq-to-sql collections iqueryable

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.