Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问IEnumerable将清除内容_C#_Cassandra_Ienumerable - Fatal编程技术网

C# 访问IEnumerable将清除内容

C# 访问IEnumerable将清除内容,c#,cassandra,ienumerable,C#,Cassandra,Ienumerable,我有一个返回IEnumerable的数据库(Cassandra)查询。我发现了一个奇怪的问题,试图找出为什么它没有返回任何数据(当我知道数据库中有数据时) 该查询实际上返回了25个条目的数据。我正在用一个Data.Count()检查这个;但后来在代码中,它是空的。我意识到计数方法是莫名其妙地清除数据 快速调查后:任何读取此数据的方法都会将其完全清除。即使在调试中,如果我加载“结果视图”以获取数据列表,最初我会看到我的25个条目,然后单击“关闭”,然后重新加载结果视图:Emtpy 以前有人有过这样

我有一个返回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。谢谢