Obfuscated Scenario: A person has zero, one or many pets.
Using Linq to Sql, the need is to get an IQueryable
list of pets for the given personID.
Here's the poorly mangled/butchered/obfuscated portion of the ERD:
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 Raised:
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?)
Failed Attempts:
Direct casting didn't work: (IQueryable<MyType>)
Calling collection method AsQueryable
didn't work: .AsQueryable<MyType>()
Question:
How can you cast the results of the LinqToSql query properly to IQueryable
?
This works for me (with different tables of course, but same relationship):
IQueryable<Pet> personPets = (
from p in db.Person
where p.ID == somePersonID
select p
).Single().Pets.AsQueryable();
Although I'd probably write it in some variation of this way:
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();
Try something like this.
Look at your query:
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
What is happening is that you are returning an IEnumerable (of one element) of IEntitySet<Pet>
types (the type: IEnumerable<IEntitySet<Pet>>
).
You should get an IEnumerable<Pet>
and it will be converted to IQueryable<Pet>
by the AsQueryable
method:
public IQueryable<Pet> GetPersonPets(int personID)
{
var person = Person.Single(p=> p.ID == personID);
return person.Pets.AsQueryable();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With