我有这个代码工作:
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 不是一个选项:))
答案 0 :(得分:5)
IEnumerable<string> result = DataContext.ExecuteQuery<string>(sqlstring)
答案 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的方法。 例如,您无法检索 输出参数,直到你打电话 关闭。
因此,您应该尽快关闭它以释放连接。