数据库
首页 > 数据库> > c# – 将SqlDataReader转换为linq表达式

c# – 将SqlDataReader转换为linq表达式

作者:互联网

在互联网上查看如何使用SqlDataReader的示例时,我发现了以下内容:

var command = new SqlCommand(  // initialize with query and connection...
var reader = command.ExecuteReader();

while(reader.Read())
{
    var foo = reader["SomeColName"];
    // etc
}

我可以使用以下扩展方法:

public static IEnumerable<IDataReader> ToEnumerable(this IDataReader reader)
{
     while (reader.Read())            
         yield return reader;            
}  

为了使用linq执行查询?

如果我使用以下扩展方法会不好?如果我关心性能,我应该使用第一个实现吗?

解决方法:

我无法看到您提出的扩展将如何帮助您,因为您只获得包含每个读取行的IDataReader的相同实例的枚举.

我不确定是否有任何好方法将IDataReader与LINQ结合起来,但你可能想要这样的东西:

public static IEnumerable<Dictionary<string, object>> ToEnumerable(this IDataReader reader)
{
    while (reader.Read())
    {
        Dictionary<string, object> result = new Dictionary<string, object>();
        for (int column = 0; column < reader.FieldCount; column++)
            result.Add(reader.GetName(column), reader.GetValue(column));
        yield return result;
    }
} 

这将返回一系列字典(每行一个字典),它将列名映射到该“单元”中的对象.

不幸的是,您失去了类型安全性并创造了内存开销.具体实施仍将取决于您真正想要实现的目标.就个人而言,我总是只使用列索引而不是名称.

也就是说,我认为最好的方法仍然是直接使用IDataReader来创建pocos并将这个pocos用于LINQ:

IEnumerable<string> GetSomeColValue(IDataReader reader)
{
    while(reader.Read())
        yield return reader.GetString(reader.GetOrdinal("SomeColName"));
}

当然这是一个缩短的例子.在实际代码中,我将完全读出读取器中的所有数据,并在返回任何内容之前关闭/处理调用ExecuteReader的方法内的reader实例.

标签:c,linq,performance,sqldatareader
来源: https://codeday.me/bug/20190717/1488271.html