Подтвердить что ты не робот

Невозможно неявно преобразовать тип 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?

4b9b3361

Ответ 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;

как ни странно