IQueryable使用后处理

时间:2011-07-14 22:22:39

标签: c# linq-to-sql

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

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所以我可以继续使用它?

4 个答案:

答案 0 :(得分:5)

您需要选择:

  1. 不处理上下文(没有using语句)并获取IQueryable<User>,这是依赖于数据库。
  2. 处理上下文并通过IQueryable<User>获取ToList().AsQueryable(),这依赖于内存。
  3. 请注意,重要的一点是数据是通过延迟加载的。

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

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