gpt4 book ai didi

c# - 使用 LinqToSql 生成返回数据库记录?

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:41 24 4
gpt4 key购买 nike

我在 DAL 中有一个供应方法:

public IEnumerable<RecordType> GetRecords()
{
using (LinqDataContext context = new LinqDataContext())
{
var records = context.RecordTable;

foreach (RecordType record in records)
{
yield return record;
}
}
}

消费者方法在 foreach 循环中使用记录。这样我想通过不缓存 RecordTable 中的所有记录来节省内存使用量,因为 LinqToSql 在后台使用 DataReader。

虽然我对这种情况有两个问题:

  1. 上面的 yield-return 真的比将所有记录缓存到一个数组 (.ToArray()) 更节省资源并且工作速度更快吗?

  2. 如果消费方法的 foreach 循环内发生错误,数据连接是否会自动正确关闭(我指的是 using 语句)或者如果消费方法会在中间中断 foreach 循环(比如找到所需的记录并 break)?

最佳答案

在执行基本查询的情况下,它可以那样工作(当然是可能的)- 然而,在查询裸Table<T> 的情况下,它可能是它首先缓冲;您也许可以尝试在迭代期间查询计数,或运行跟踪。在这种情况下,我怀疑它会先缓冲。

重新关闭:这也取决于 ;p 如果有人正在使用 foreach , 然后是:因为 foreach通过 finally 显式处理迭代器.然而!不保证有人这样做,例如(非常顽皮和松懈):

var iter = yourData.GetEnumerator();
if(iter.MoveNext()) {
Console.WriteLine(iter.Current.Name); // first record of, say, 20
}
// and don't dispose the iterator == bad

那么由于迭代器没有 a: 被处置,b: 耗尽自身,并且 c: 没有崩溃,它不会正常关闭(这 3 个条件中的任何一个都会关闭它正确)。强调:这是一个病态的案例:通常说“它会关闭,是的”是相当安全的。

如果你想要保证非缓冲,注意“dapper”有这个,如果你设置bufferedfalse :

IEnumerable<Customer> customers = connection.Query<Customer>(
"select * from Customer", buffered: false);

(它还可以处理参数等)

关于c# - 使用 LinqToSql 生成返回数据库记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com