NpGsql EntityFramework 6 - "一项操作已在进行中"

时间:2015-12-31 09:33:59

标签: c# entity-framework postgresql npgsql

我正在开发一个项目,使用NpGsql EntityFramework 6连接到PostgreSQL数据库。当我尝试在GetAdminUsersCount中执行查询时,我收到问题标题中的异常:

public class GenieRepository : IDisposable
{
    GenieDbContext db = new GenieDbContext();
    public IEnumerable<User> GetUsers()
    {
        return db.Users;
    }   
}

public int GetAdminUsersCount()
{
    return repo.GetUsers().Where(u => u.Role.RoleName == "Administrator").Count();
}

此错误的原因是什么以及如何解决?

2 个答案:

答案 0 :(得分:7)

我已经成功地在linq查询之后使用ToList<T>解决问题,如下所示:

using (ElisContext db = new ElisContext()) {
    var q = from a in db.aktie select a;
    List<aktie> akties = q.ToList<aktie>();
    foreach (aktie a in akties) {
        Console.WriteLine("aktie: id {0}, name {1}, market name {2}"
                 , a.id, a.name, a.marked.name);
    }
}

请注意执行此操作的q.ToList<T>。 .Net将linq语句的执行推迟到最新时刻,这可能是问题的一部分。我试图在foreach中使用q而没有成功。

答案 1 :(得分:4)

问题是由GetUsers()方法的返回类型引起的。由于它是IEnumerable<User>,LINQ-to-SQL会将结果加载到内存中(逐行)和后续WhereOrderBySelectCount等等调用将在内存中执行。在评估Where条件时,原始结果集仍在迭代,但需要在DB上解析关系User.Role(&#34; An操作的位置)已经处于进展状态&#34;错误消息来自)。

如果返回类型更改为IQueryable<User>,则在调用Count方法之前不会执行查询,此外,整个查询将被转换为仅返回SQL的SQL在没有将任何User记录加载到内存中的情况下进行计数。

另请参阅此相关问题/答案:Returning IEnumerable<T> vs. IQueryable<T>

建议在查询上调用ToList()的答案会将整个结果集加载到内存中,这会使您的错误消失,但是根据结果集的大小,也可能效率非常低。 / p>