Вопрос по linq-to-sql, linq – Не удается неявно преобразовать тип IEnumerable в IQueryable

20

Obfuscated ScenarioЧеловек имеет ноль, одного или нескольких домашних животных.

Используя Linq to Sql, нужно получитьIQueryable список домашних животных для данного лица. Вот плохо изуродованная / истерзанная / запутанная часть 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:

Прямое литье не работает:(IQueryable<MyType>)

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

Question:

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

Ваш Ответ

5   ответов
1

и это прекрасно работает. Который я настраиваю простую базу данных с вашими вышеупомянутыми двумя таблицами, и генерирую класс данных с VS.

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

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

45

конечно, но с теми же отношениями):

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

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

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

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

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

Error: User Rate Limit Exceeded

Похожие вопросы