我有一些看起来像这样的短代码:
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的Linq Dynamic。有没有办法返回本地IQueryable所以我可以继续使用它?
答案 0 :(得分:5)
您需要选择:
IQueryable<User>
,这是依赖于数据库。IQueryable<User>
获取ToList().AsQueryable()
,这依赖于内存。请注意,重要的一点是数据是通过延迟加载的。
答案 1 :(得分:4)
问题是您正在创建数据上下文然后处理它:
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);
}
我在这里做的是我将数据上下文移到了方法之外,现在的问题是你需要自己控制它的处理,你可能还需要考虑阻止更多的连接,所以一定要处理连接。
修改强>
我认为你也希望能够使用关系等。
答案 2 :(得分:1)
问题是你正在处理DataContext。一种选择是在使用查询结果时保留它。
答案 3 :(得分:1)
如果你想真正做你想要的事情
public static IQueryable<User> SelectFromEmployee(int employee)
{
using (var ctx = Database.AccountingContext())
{
return ctx.Users.Where(c => c.Employee_FK == employee).ToList().AsQueryable();
}
}
请注意,您返回的内容不再与数据上下文相关联,因此,例如,如果未处理数据上下文,则关系导航将无法正常工作。