由于动态查询,将SqlDataReader转换为未知类型的List

时间:2011-12-06 09:18:12

标签: .net list sqldatareader

友 我有一个动态的SQL查询,我想执行并返回一个列表。 从我在goole上的大多数互联网搜索中,我发现必须知道列表的类型才能将sqldatareader转换为列表。 当我不知道将执行什么查询时,我该怎么做呢。

Execute(String query)
{
  SqlConnection con=new SqlConnection(connection);//connection from elsewhere
  SqlCommand cmd = new SqlCommand(query);
  cmd.connection=con;
  con.Open();
  SqlDataReader result=cmd.ExecuteReader();
  //How to convert result to a list when i do not know the table structure 
} 

现在我想将结果转换为列表。 但是我不知道查询工作的表的详细信息。查询可以有所不同,它可以查询任何表。 所以在这些条件下如何将结果转换为列表。有可能吗?

这给我留下了一个简单的问题,如果我不知道表格的详细信息,那么列表的条目是什么,或者它将是什么列表?

为了回答这个问题,我问自己另一个问题,是否有可能有一个列表,其中每个列表条目将对应于SqlDataReader结果的一行?

所以我可以使用List< DataRow> x = result.Select()。ToList(),但我也不想使用它。

我希望列表的每个条目都映射到结果的每一行,同时由构成一行的原子数据类型组成。

例如从学生中选择studentname,studentid; 这将返回一个SqlDataReader结果,我想构建一个类型包含字符串和int的列表,然后用结果行填充列表。

当查询更改为从studentid = 1432 的标记中选择标记,主题,成绩时,我想构建一个类型包含int,string,char的列表,然后用结果的行。

有办法吗?

PS如果我返回如上所述的列表,用户知道如何选择值,因为他创建了查询并知道了预期的列数。

1 个答案:

答案 0 :(得分:3)

如果来电者知道该类型,则make是一种通用方法,并且每行创建一个T ...

或者,因为dapper-dot-net已经这样做了:

var list = connection.Query<T>(command [, args]).ToList();

如果调用者也无法知道T,您可以使用ExpandoObject填充List<dynamic>,将expando转换为IDictionary<string,object>以使用键/值对填充它。< / p>

或者,因为dapper-dot-net已经这样做了:

var list = connection.Query(command [, args]).ToList();

然后调用者可以使用:

foreach(var item in list) {
    Console.WriteList("{0}, {1}, {2}", item.marks, item.subject, item.grade);
}