Невозможно неявно преобразовать тип IEnumerable <T> в IQueryable <T>
Obfuscated Scenario. У человека есть ноль, один или несколько домашних животных.
Используя Linq to Sql, необходимо получить список IQueryable
для домашних животных для данного человека.
Здесь плохо искалеченная/замученная/обфускационная часть 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
?
Ответы
Ответ 1
Это работает для меня (с разными таблицами, конечно, но с теми же отношениями):
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();
Ответ 2
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
Попробуйте что-то вроде этого.
Ответ 3
Посмотрите на свой запрос:
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();
}
Ответ 4
У меня есть следующее, и он отлично работает. Который я настраиваю простую базу данных с вышеупомянутыми двумя таблицами и генерирую dataclass с VS.
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
Похоже, что ваш Личность на самом деле является Класс вместо объекта базы данных (который по умолчанию называется генератором кода). Проверьте, работает ли это выше для вас, иногда отладчик может просто дать вам какую-то причудливую причину, которая на самом деле не указывает на реальную проблему.
Ответ 5
что сработало для меня,
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
как ни странно