IQueryable утилизируется после использования - PullRequest
7 голосов
/ 15 июля 2011

У меня есть короткий код, который выглядит следующим образом:

public static IQueryable<User> SelectFromEmployee(int employee)
{
    using (var ctx = Database.AccountingContext())
    {
        return ctx.Users.Where(c => c.Employee_FK == employee);
    }
}

Если я просто оставлю этот код как есть и использую результат, я получаю исключение, сообщающее, что данные удалены.Но если я делаю так:

public static IEnumerable<User> SelectFromEmployee(int employee)
{
    using (var ctx = Database.AccountingContext())
    {
        return ctx.Users.Where(c => c.Employee_FK == employee).ToList();
    }
}

Все работает просто отлично.Но моя проблема в том, что я хочу использовать Linq Dynamic, который требует IQueryable.Есть ли способ вернуть локальный IQueryable, чтобы я мог продолжить работу с ним?

Ответы [ 4 ]

5 голосов
/ 15 июля 2011

Вам нужно выбрать:

  1. Не удаляя контекст (без оператора using) и получая IQueryable<User>, что полагается на базу данных.
  2. Удаление контекста и получение IQueryable<User> через ToList().AsQueryable(), что зависит от памяти.

Обратите внимание, что важным моментом является то, где данные проходят через отложенную загрузку.

4 голосов
/ 15 июля 2011

Проблема в том, что вы создаете свой контекст данных, а затем удаляете его:

using (var ctx = Database.AccountingContext())

Просто чтобы начать работу, попробуйте вместо этого:

ObjectContext context = Database.AccountingContext();
public static IQueryable<User> SelectFromEmployee(int employee)
{
    return context.Users.Where(c => c.Employee_FK == employee);
}

Что я сделал здесь, так это то, что вместо этого я переместил контекст данных за пределы метода, теперь проблема заключается в том, что вам нужно самостоятельно контролировать его удаление, и вам также может потребоваться учитывать, что вы блокируете для большего количества соединений, поэтомуОбязательно избавьтесь от соединения.

Редактировать

Я предполагал, что вы хотите иметь возможность использовать отношения и т. д.

1 голос
/ 15 июля 2011

Если вы хотите буквально делать то, что вы просите

public static IQueryable<User> SelectFromEmployee(int employee)
{
    using (var ctx = Database.AccountingContext())
    {
        return ctx.Users.Where(c => c.Employee_FK == employee).ToList().AsQueryable();
    }
}

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

1 голос
/ 15 июля 2011

Проблема в том, что вы избавляетесь от DataContext. Один из вариантов - сохранить его во время использования результата запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...