关于yield的使用解决方法

关于yield的使用


public class Dbhelpercs
{
    public IEnumerable<T> FindAs<T>(string sqlwhere = "") where T : new()
    {
        SqlConnection conn = new SqlConnection(@"Server=SHADOW-PC\SQLEXPRESS;Integrated Security=SSPI;database=test");
        conn.Open();
        SqlCommand comm = conn.CreateCommand();
        comm.CommandText = "select * from " + typeof(T).Name + " " + sqlwhere;
        SqlDataReader dataList = comm.ExecuteReader();
        while (dataList.Read())
        {
            T t = new T();
            var property = t.GetType().GetProperties();
            foreach (var thisPro in property)
            {
                thisPro.SetValue(t, dataList[thisPro.Name], null);
            }
            yield return t;
        }
        conn.Close();
    }

    public void AA()
    {
        Dbhelpercs d = new Dbhelpercs();
        var list1= d.FindAs<类型>();//单次使用
        var list2=d.FindAs<类型>().ToList()//多次使用
    }
}



新手刚接触SQL,抛开SQL注入不说,这样的设计合理吗?FindAs方法返回的相当于一个游标,如果多次使用,就把它TOLIST加载到内存当中。。

如果数据量大的时候,而且我们只对list1使用1次的话,这样的设计会不会更合理?
------解决方案--------------------
用yield return特别要注意,你的conn.Close();可能始终调用不到。