将列值返回为IEnumerable

时间:2009-10-15 14:48:01

标签: c# sql linq yield

我有这个代码工作:

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)方式,而不必诉诸收益率回报。 ( LINQ to SQL 不是一个选项:))

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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在DataReader上使用Linq表达式:

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

但请注意,您需要来调用ToList(),否则当您尝试枚举时会出现错误,因为读者已经关闭。

修改

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

  

在使用SqlDataReader时,   关联的SqlConnection正忙   提供SqlDataReader,没有   可以执行其他操作   除了关闭之外的SqlConnection   它。在关闭之前就是这种情况   调用SqlDataReader的方法。   例如,您无法检索   输出参数,直到你打电话   关闭。

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