我正在开发一个项目,使用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();
}
此错误的原因是什么以及如何解决?
答案 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会将结果加载到内存中(逐行)和后续Where
,OrderBy
,Select
,Count
等等调用将在内存中执行。在评估Where
条件时,原始结果集仍在迭代,但需要在DB上解析关系User.Role
(&#34; An操作的位置)已经处于进展状态&#34;错误消息来自)。
如果返回类型更改为IQueryable<User>
,则在调用Count
方法之前不会执行查询,此外,整个查询将被转换为仅返回SQL的SQL在没有将任何User
记录加载到内存中的情况下进行计数。
另请参阅此相关问题/答案:Returning IEnumerable<T> vs. IQueryable<T>
建议在查询上调用ToList()
的答案会将整个结果集加载到内存中,这会使您的错误消失,但是根据结果集的大小,也可能效率非常低。 / p>