2009-07-04 64 views
19

ofuscado Escenario: Una persona tiene cero, uno o muchos animales domésticos.No se puede convertir implícitamente el tipo IEnumerable <T> a IQueryable <T>

Utilizando Linq to Sql, la necesidad es obtener una lista de mascotas IQueryable para el ID de persona dado. Aquí es la parte pobre mutilado/descuartizado/ofuscado de la ERD:

alt text

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 lanzada:

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

Error Att adelanta:

colada directa no funcionó: (IQueryable<MyType>)

Llamando al método de recogida AsQueryable no funcionó: .AsQueryable<MyType>()

Pregunta:

Cómo se puede emitir los resultados de la LinqToSql consulta correctamente al IQueryable?

Respuesta

44

Esto funciona para mí (con diferentes mesas por supuesto, pero misma relación):

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

Aunque probablemente me gustaría escribir en alguna variante de esta manera:

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

tengo lo siguiente y funciona perfectamente. Que configuro una base de datos simple con sus 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; 

Parece que a mí, su persona es en realidad el Clase en lugar del objeto de base de datos (que por defecto es nombrado por el generador de código). Pruebe si lo anterior funciona para usted primero, a veces el depurador puede simplemente darle alguna razón extraña que en realidad no está apuntando al problema real.

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

Pruebe algo como esto.

+0

Prefiero ¡Esta solución, funcionó muy bien para mí! –

2

mirada a su consulta:

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

Lo que ocurre es que va a devolver un IEnumerable (de un elemento) de IEntitySet<Pet> tipos (del tipo: IEnumerable<IEntitySet<Pet>>).

Debe obtener un IEnumerable<Pet> y se convertirá a IQueryable<Pet> por el método AsQueryable:

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

    return person.Pets.AsQueryable(); 
} 
1

lo que funcionó para mí,

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

Cuestiones relacionadas