p.campbell
p.campbell

Reputation: 100567

Cannot implicitly convert type IEnumerable<T> to IQueryable<T>

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:

alt text

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?

Upvotes: 23

Views: 69817

Answers (5)

Blorgbeard
Blorgbeard

Reputation: 103467

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();    

Upvotes: 49

Hellola
Hellola

Reputation: 113

what worked for me,

    var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
                 where p.PersonId == 1
                 select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;

strangely enough

Upvotes: 1

Christian C. Salvad&#243;
Christian C. Salvad&#243;

Reputation: 827366

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();
}

Upvotes: 2

Andrew Siemer
Andrew Siemer

Reputation: 10278

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

Try something like this.

Upvotes: 2

xandy
xandy

Reputation: 27411

I have the following and it works perfectly. Which I setup a simple database with your above mentioned two tables, and generate the dataclass with VS.

var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
                 where p.PersonId == 1
                 select p.Pet;

It looks like to me, your Person is actually the Class instead of the database object (which is by default named by the code generator). Test if the above works for you first, sometimes the debugger may simply give you some freaky reason which is not actually pointing to the real problem.

Upvotes: 1

Related Questions