Как я могу вернуть IEnumerable данные из функции в GridView с Entity Framework? - PullRequest
1 голос
/ 04 апреля 2010
protected IEnumerable GetPersonalsData()
{
   // List<Personals> personel;
   using (FirmaEntities firmactx = new FirmaEntities())
   {
      var personeldata = (from p in firmactx.Personals select new { p.ID, p.Name, p.SurName });
      return personeldata.AsEnumerable();
   }
}

Я хочу отправить GetPersonelData () в GridView DataSource. Как это:

gwPersonel.DataSource = GetPersonelData(); 
gwPersonel.DataBind();

Мониторинг: gwPersonel.DataBind (); эта ошибка:

"Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения."

Ответы [ 3 ]

1 голос
/ 04 апреля 2010

Проблема в том, что 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.

0 голосов
/ 04 апреля 2010

Когда вы возвращаетесь из метода, контекст объекта исчезает, но запрос еще не выполнен (отложенное выполнение). Вам нужно будет либо сохранить контекст объекта, либо убедиться, что запрос выполняется и результаты доступны в методе GetPersonalData, вызывая ToList ().

0 голосов
/ 04 апреля 2010

Как только функция возвращается, я думаю, что контекст исчез, поэтому перечисление не может быть использовано. Просто преобразуйте его в список (используйте вместо него .ToList ()), его можно добавить в источник данных.

...