我有一个返回IEnumerable的数据库(Cassandra)查询。试图找出为什么没有返回数据(当我知道数据库中的数据时)我发现了一个奇怪的问题。
查询实际上返回数据,25个条目。我用Data.Count()检查了这个;但后来在代码中,它是空的。我意识到计数方法无法清除数据。
经过快速调查:任何读取此数据的信息都会完全清除。即使在调试中,如果我加载"结果视图"要获取数据列表,最初我看到我的25个条目 - 然后如果我单击关闭,然后重新加载结果视图:Emtpy。
以前有过这样的人吗?
String connectionString = "SELECT * FROM thedatabase WHERE thecondition";
RowSet Data = ExecuteComand(connectionString);
if (Data == null) // interestingly, I can check for null without issue
{
OutputMessage("Output to " + exportFile + " failed");
return;
}
int b = Data.Count(); // results in 25
int c = Data.Count(); // results in 0
答案 0 :(得分:4)
我不知道cassandra但是我假设返回的IEnumerable<T>
是懒惰地执行(延迟)。通过使用它(例如foreach
,ToList
或Count
),执行查询并处理/关闭资源(即连接)。
如果是这种情况,您可以将其加载到内存集合中,例如:
var data = ExecuteComand("SELECT * FROM thedatabase WHERE thecondition").ToList();
现在您可以使用data.Count
而无需“清除”它。
答案 1 :(得分:3)
无法保证Enumerable
可以枚举两次。正确构建的可枚举应该至少抛出异常,但总是会发生错误的代码。你可以做的是在一个表现良好的集合中实现它,例如List<T>
:
var data2 = Data.ToList();
int b = data2.Count;
int c = data2.Count;
现在你甚至可以获得Count
是O(1)而不是O(N)的优势:-)(在List<T>
中,Count
值是&#34;缓存& #34)