IQueryable在使用后进行处理

本文关键字:处理 IQueryable | 更新日期: 2023-09-27 18:02:03

我有一些短代码,看起来像这样:

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

一切都很好。但我的问题是,我想使用需要IQueryable的LinqDynamic。有没有办法退回当地的IQueryable,这样我就可以继续使用它了?

IQueryable在使用后进行处理

您需要选择:

  1. 不处理上下文(不使用using语句(并获取依赖于Database的IQueryable<User>
  2. 处理上下文并通过依赖于Memory的ToList().AsQueryable()获得IQueryable<User>

请注意,重要的一点是数据通过延迟加载的位置

问题是您正在创建数据上下文,然后对其进行处理:

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

我在这里所做的是,我将数据上下文移到了方法之外,现在的问题是,你需要自己控制对它的处理,你可能还需要考虑到你正在阻止更多的连接,所以一定要处理连接。

编辑

我以为你也希望能够使用关系等。

问题是您正在处理DataContext。一种选择是在使用查询结果时保留它。

如果你想按照的要求去做

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

但是要注意,您返回的内容不再与数据上下文关联,因此,例如,如果数据上下文没有被处理,则关系导航将无法正常工作。