Невозможно неявно преобразовать тип IEnumerable ‹T› в IQueryable ‹T›

Скрытый сценарий: у человека нет, одного или нескольких домашних животных.

Используя Linq to Sql, необходимо получить IQueryable список домашних животных для данного personID. Вот плохо искаженная / зарезанная / запутанная часть ERD:

alt text

Код:

 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
    }

Возникло исключение:

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

Неудачные попытки:

Прямое преобразование не сработало: (IQueryable<MyType>)

Вызов метода сбора AsQueryable не сработал: .AsQueryable<MyType>()

Вопрос:

Как правильно преобразовать результаты запроса LinqToSql в IQueryable?


person p.campbell    schedule 04.07.2009    source источник


Ответы (5)


Это работает для меня (конечно, с разными таблицами, но с теми же отношениями):

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

Хотя, наверное, я бы написал это в каком-нибудь варианте так:

var personPets = 
    db.Person.Single(t => t.Id == somePersonId).Pets.AsQueryable();    
person Blorgbeard    schedule 04.07.2009

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

Попробуйте что-нибудь подобное.

person Andrew Siemer    schedule 04.07.2009

Посмотрите на свой запрос:

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

Что происходит, так это то, что вы возвращаете IEnumerable (из одного элемента) IEntitySet<Pet> типов (тип: IEnumerable<IEntitySet<Pet>>).

Вы должны получить IEnumerable<Pet>, и он будет преобразован в IQueryable<Pet> методом AsQueryable:

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

    return person.Pets.AsQueryable();
}
person Christian C. Salvadó    schedule 04.07.2009

У меня есть следующее, и он отлично работает. Я настраиваю простую базу данных с двумя вышеупомянутыми таблицами и создаю класс данных с помощью VS.

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

Мне кажется, что ваше лицо на самом деле является классом, а не объектом базы данных (который по умолчанию назван генератором кода). Сначала проверьте, работает ли вышеуказанное для вас, иногда отладчик может просто указать вам причину, которая на самом деле не указывает на настоящую проблему.

person xandy    schedule 04.07.2009

что сработало для меня,

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

достаточно странно

person Hellola    schedule 10.08.2010