Проблема в том, что AsEnumerable делает именно то, что возвращает IEnumerable.Заданный вами запрос не выполняется в этот момент.Только когда что-то, что получает это, пытается перечислить это, запрос будет фактически выполнен.В этом случае что-то находится за пределами GetPersonalsData
, а экземпляр FirmaEntities
, от которого зависит запрос, будет удален к этому моменту.Отсюда и ошибка.
Более ранние мысли здесь, но не столь уместные в этом случае, я подозреваю,
Вы могли бы рассмотреть возможность использования ToList()
вместо ToEnumerable()
, что в большинствесценарии лучшее решение.Другой альтернативой может быть: -
protected IEnumerable GetPersonalsData()
{
// List personel;
using (FirmaEntities firmactx = new FirmaEntities())
{
foreach (var item in (from p in firmactx.Personals))
select new { p.ID, p.Name, p.SurName });
{
yield return item;
}
}
}
Это похоже, но не совсем то же самое, что и вызов AsEnumerable
.В этом случае при каждом перечислении возвращенного IEnumerable
(вызывается его метод GetEnumerator
) происходит новое выполнение функции (когда вызывается метод IEnumerator.MoveNext
).Это позволяет вам откладывать (или не заканчивать) выполнение запроса вообще.Экземпляр firmactx
не будет удален до тех пор, пока не будет завершено перечисление.
После мыслей
Вы присваиваете сетку, которую вы, возможно, захотите просмотретьи / или сортировка фильтра.В этом случае вам лучше удерживать экземпляр контекста как поле в вашем UserControl.Используя этот экземпляр контекста, присвойте запрос personeldata напрямую источнику данных, не используя AsEnumerable
.