Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 使用'时保持数据库连接;收益率';_C#_.net_Database Connection_Ado_Yield - Fatal编程技术网

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