代码之家  ›  专栏  ›  技术社区  ›  JoelFan

将列值作为IEnumerable返回

  •  3
  • JoelFan  · 技术社区  · 15 年前

    我有这个代码在工作:

    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"];
    }
    

    但是,我想知道是否有更好的方法(林奇什),不必求助于 生利 . (和) 解决并发冲突 不是选项:))

    2 回复  |  直到 15 年前
        1
  •  5
  •   Amy B    15 年前
    IEnumerable<string> result = DataContext.ExecuteQuery<string>(sqlstring)
    

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

        2
  •  3
  •   Gabe Moothart    15 年前

    你不应该这样做!你的读者需要尽快关闭。您不希望在枚举期间保持打开状态。最好只创建一个显式列表,并返回它。

    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(),否则当您试图枚举时会得到一个错误,因为读卡器已经关闭。

    编辑

    在评论数据阅读器打开时,它实际上做了什么时,似乎有些混乱。 From MSDN :

    当使用sqldatareader时, 关联的sqlconnection正忙 服务于sqldatareader,而不是 其他操作可以在 非关闭的sqlconnection 它。在结案前是这样的 调用了sqldatareader的方法。 例如,您无法检索 输出参数直到调用 关闭。

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