C# 访问IEnumerable将清除内容
我有一个返回IEnumerable的数据库(Cassandra)查询。我发现了一个奇怪的问题,试图找出为什么它没有返回任何数据(当我知道数据库中有数据时) 该查询实际上返回了25个条目的数据。我正在用一个Data.Count()检查这个;但后来在代码中,它是空的。我意识到计数方法是莫名其妙地清除数据 快速调查后:任何读取此数据的方法都会将其完全清除。即使在调试中,如果我加载“结果视图”以获取数据列表,最初我会看到我的25个条目,然后单击“关闭”,然后重新加载结果视图:Emtpy 以前有人有过这样的经历吗C# 访问IEnumerable将清除内容,c#,cassandra,ienumerable,C#,Cassandra,Ienumerable,我有一个返回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
不能保证可枚举的
可以枚举两次。一个正确构建的可枚举项至少应该抛出一个异常,但坏代码总是会发生的。您可以将其具体化为一个行为良好的集合,例如列表
:
var data2 = Data.ToList();
int b = data2.Count;
int c = data2.Count;
var data = ExecuteComand("SELECT * FROM thedatabase WHERE thecondition").ToList();
现在您甚至有一个优势,Count
是O(1)而不是O(N):-)(在列表中,Count
值是“缓存的”)我不知道cassandra,但我假设返回的IEnumerable
是延迟执行的。通过使用它(例如,使用foreach
、ToList
或Count
),执行查询并释放/关闭资源(例如连接)
如果是这种情况,您可以将其加载到内存中的集合中,例如:
var data2 = Data.ToList();
int b = data2.Count;
int c = data2.Count;
var data = ExecuteComand("SELECT * FROM thedatabase WHERE thecondition").ToList();
现在,您可以使用数据。计数而无需“清除”它。不熟悉Cassandra及其连接器,因此不确定它为什么这样做。可能是性能调整,以便只执行一次查询?我不知道这是否适合你,但你有没有尝试过将IEnumerable具体化?这就是var data=data.ToList(),然后使用它?@Juan这很有效,非常感谢。谢谢,这非常有效。我将不得不记住这一点,并在将来使用Enumerable。谢谢