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,这样我就可以继续使用它了?
您需要选择:
- 不处理上下文(不使用using语句(并获取依赖于Database的
IQueryable<User>
- 处理上下文并通过依赖于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();
}
}
但是要注意,您返回的内容不再与数据上下文关联,因此,例如,如果数据上下文没有被处理,则关系导航将无法正常工作。