C# 使用'时保持数据库连接;收益率';
我有一个基本的数据类(为简洁起见,将其剥离并编译):C# 使用'时保持数据库连接;收益率';,c#,.net,database-connection,ado,yield,C#,.net,Database Connection,Ado,Yield,我有一个基本的数据类(为简洁起见,将其剥离并编译): 仅供参考,你可以使用语句来堆叠你的,如果你想避免所有的嵌套的话,我实际上使用的是VB.NET,但是我在家,所以只需要在C中模拟一下等价的语句# public static class Database { public static IEnumerable<T> GetRecords<T>(string query, Func<IDataReader, T> mappingFunction)
仅供参考,你可以使用语句来堆叠你的
,如果你想避免所有的嵌套的话,我实际上使用的是VB.NET,但是我在家,所以只需要在C中模拟一下等价的语句#
public static class Database
{
public static IEnumerable<T> GetRecords<T>(string query, Func<IDataReader, T> mappingFunction)
{
var connectionString = "";
using (var connection = new SqlConnection(connectionString))
{
using (var command = new SqlCommand(query, connection))
{
using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while(reader.Read()) {
yield return mappingFunction(reader);
}
}
}
}
}
}
var records = Database.GetRecords("SELECT FirstName FROM [Order]", reader =>
new Order { FirstName = reader["FirstName"].ToString() });
public class Order {
public string FirstName;
}
using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
var items = new List<T>();
while(reader.Read()) {
items.Add(mappingFunction(reader));
}
return items;
}
var orders = Database.GetRecords("SELECT [things] FROM [Order]", reader => MapOrder(reader));
IEnumerable<ReportRecord>() GetRecords(IEnumerable<Order> orders)
{
foreach (var order in orders)
{
var reportRecord = new ReportRecord();
var items = GetOrderItems(order);
// other queries, calculations etc
yield return reportRecord;
}
}
// save to disk using CsvHelper and output file
CsvHelper.Save(GetRecords(), filepath); // fake code -- but uses the IEnumerable instead of materialised list