3

我有这个代码工作:

public IEnumerable<string> GetEmpNames()
{
    var cmd = SqlCommand("select [EmpName] from [dbo].[Emp]");
    using (var rdr = cmd.ExecuteReader())
        while (rdr.Read())
            yield return (string) rdr["EmpName"];
}

但是,我想知道是否有更好的(LINQish)方法,而不必诉诸yield return。(而且LINQ to SQL不是一个选项 :))

4

2 回答 2

5
IEnumerable<string> result = DataContext.ExecuteQuery<string>(sqlstring)

http://msdn.microsoft.com/en-us/library/bb361109.aspx

于 2009-10-15T14:52:08.507 回答
3

你不应该那样做!您的阅读器需要尽快关闭。您不想在枚举期间保持打开状态。最好只创建一个显式列表并将其返回。

var cmd = SqlCommand("select [EmpName] from [dbo].[Emp]");
List<string> results = new List<string>();
using (var rdr = cmd.ExecuteReader()) {
    while (rdr.Read())
        results.Add((string) rdr["EmpName"]);
}
return results;

您可以通过强制转换在 DataReader 上使用 Linq 表达式:

using (var rdr = cmd.ExecuteReader()) {
    results = (from row in rdr.Cast<DbDataRecord>()
               select (string)row["EmpName"]).ToList();
}

但是注意需要调用ToList(),否则在尝试枚举的时候会报错,因为reader已经被关闭了。

编辑

关于 DataReader 打开时实际执行的操作的评论似乎有些混乱。来自 MSDN

在使用 SqlDataReader 时,关联的 SqlConnection 正忙于为 SqlDataReader 提供服务,除了关闭 SqlConnection 之外,无法对 SqlConnection 执行其他操作。在调用 SqlDataReader 的 Close 方法之前就是这种情况。例如,在调用 Close 之前,您无法检索输出参数。

因此,您应该尽快关闭它以释放连接。

于 2009-10-15T14:52:24.420 回答