Если вы используете выделенную память, значит, вы не делаете ничего плохого. Это становится проблемой, когда вы пишете функции (кроме основной), которые выделяют память, не освобождая ее и не делая ее доступной для остальной части вашей программы. Затем ваша программа продолжает работать с выделенной ей памятью, но никак не может ее использовать. Ваша программа и другие запущенные программы лишены этой памяти.
Редактировать: Не на 100% точно сказать, что другие работающие программы лишены этой памяти. Операционная система всегда может позволить им использовать ее за счет выгрузки вашей программы в виртуальную память (</handwaving>
). Однако дело в том, что если ваша программа освобождает память, которую она не использует, то обмен виртуальной памятью с меньшей вероятностью будет необходим.
У меня это работает (с разными таблицами, конечно, но с той же взаимосвязью):
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();
List<Pet> personPets =
(from p in Persons
where p.ID == somePersonID
select p.Pets).ToList();
Попробуйте что-нибудь вроде этого.
Посмотрите на свой запрос:
var personPets= from p in Person
where p.ID == somePersonID
select p.Pets;
Происходит то, что вы возвращаете IEnumerable (из одного элемента) типов IEntitySet
(тип: IEnumerable
).
Вы должны получить IEnumerable
, и он будет преобразован в IQueryable
Метод AsQueryable
:
public IQueryable<Pet> GetPersonPets(int personID)
{
var person = Person.Single(p=> p.ID == personID);
return person.Pets.AsQueryable();
}
У меня есть следующее, и оно отлично работает. Я настраиваю простую базу данных с двумя вышеупомянутыми таблицами и создаю класс данных с помощью VS.
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
Мне кажется, что ваш Person на самом деле является Class , а не объектом базы данных (который по умолчанию назван генератором кода). Сначала проверьте, работает ли описанное выше для вас, иногда отладчик может просто указать причину, которая на самом деле не указывает на настоящую проблему.
что сработало для меня,
var db = new DataClasses1DataContext();
var personPets = from p in db.Persons
where p.PersonId == 1
select p.Pet;
IQuerable<Pet> pets = (IQuerable<Pet>)personPets;
как ни странно