gpt4 book ai didi

c# - 延迟加载 IEnumerable.Take()

转载 作者:行者123 更新时间:2023-11-30 15:03:25 26 4
gpt4 key购买 nike

有人可以向我解释为什么我的 IEnumerable 没有延迟加载到 GetMessages().Take(5) 上吗?如果我调试 foreach 循环,它似乎一次延迟加载前 5 条消息,将它们添加到 listBox1,但在这 5 条之后它将继续填充列表的其余部分(这需要一分钟)在循环之后继续执行之前。

    public void PopulateMessages()
{
foreach (string message in GetMessages().Take(5))
{
listBox1.Items.Add(message);
}
}

private static IEnumerable<string> GetMessages()
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();

// The Message table has thousands of rows
SqlDataReader reader = new SqlCommand("SELECT * FROM Message", conn).ExecuteReader();

while (reader.Read())
{
yield return reader.GetString(0);
}
}
}

谢谢。

最佳答案

延迟加载它们,但是:sql 命令仍在运行。您可能会尝试的一件事是更多地使用:

using(var cmd = new SqlCommand("SELECT * FROM Message", conn))
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return reader.GetString(0);
}
}

但是,最佳 解决方案是生成包含 TOP 5TOP (@count) 的 TSQL如果你想参数化。

这将尽快处理阅读器和命令。也就是说:连接已经正确处理。

关于c# - 延迟加载 IEnumerable.Take(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11578367/

26 4 0