友 我有一个动态的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如果我返回如上所述的列表,用户知道如何选择值,因为他创建了查询并知道了预期的列数。
答案 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);
}