Как преобразовать результат SqlDataReader в общий список List<T>

Я пытаюсь получить записи из базы данных Azure с помощью Ado.net. Для этого я использовал класс SqlDataReader. Несмотря на то, что выборка данных прошла успешно, я не знаю, как преобразовать ее в общий список.

protected List<T> GetList<T>()
        {
            try
            {
                using (var query = ExecuteReader())
                {
                         // What Goes Here ?
                }

            }
            finally
            {
                if (_sqlCommand.Connection.State == ConnectionState.Open)
                {
                    _sqlCommand.Connection.Close();
                }
            }
        }

метод ExecuteReader,

protected SqlDataReader ExecuteReader()
        {
            if (_sqlCommand.Connection.State != ConnectionState.Open)
            {
                _sqlCommand.Connection.Open();
            }

            return _sqlCommand.ExecuteReader();
        }

Модель данных,

public class Student
    {
        [EntityKey]
        public int StudentId { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Major { get; set; }

    }

ПРИМЕЧАНИЕ: Я хотел бы знать, есть ли другие простые способы

🤔 А знаете ли вы, что...
С C# можно разрабатывать мобильные приложения для платформы Android с использованием Xamarin.


57
3

Ответы:

while (query.Read())
{
  Console.WriteLine($"First column {query[0]}");
  Console.WriteLine($"Named column {query["put a columnname here"]}");
}

Read() даст вам первую и следующую строки.


Решено

SqlDataReader — это не контейнер, это курсор, используемый для загрузки данных. Его нельзя преобразовать в любой тип контейнера. Код приложения должен использовать его для загрузки результатов, а затем создавать объекты и помещать их в список. Это описано в документах ADO.NET, например, в Получение данных с помощью DataReader:

    var list=new List<Student>();
    if (reader.HasRows)
    {
        while (reader.Read())
        {
            var student=new Student();
            student.Id=reader.GetInt32(0);
            student.Name = reader.GetString(1));
            ...
        }
    }
    else
    {
        Console.WriteLine("No rows found.");
    }

Это много шаблонов, поэтому ORM, такие как Entity Framework, или микро-ORM, такие как щеголеватый, используются для выполнения запросов и сопоставления результатов с объектами.

Используя Dapper, весь этот код можно заменить на:

var sql = "Select * from Students where Major=@major";
var students=connection.Query<Student>(sql,new {major = "Computer Science"});

Dapper создаст параметризованный запрос с параметром @major, выполнит его, создаст объекты Student из результатов и вернет их в виде IEnumerable<Student>. Он даже заботится об открытии и удалении соединения.

Dapper использует Reflection для определения свойств типа, использует их имена для загрузки правильных полей и присваивает их создаваемым объектам.


var dt=new DataTable();
dt.Load(myDataReader);
list<DataRow> dr=dt.AsEnumerable().ToList();

ИЛИ

 public DataReaderToListModel()  
        {  
            StudentList = new ObservableCollection<StudentModel>();  
            LoadData();  
        }  
public ObservableCollection<StudentModel> StudentList { get; set; }
 #region Varible declarations  
        private SqlConnection _sqlConnection;  
        private SqlCommand _sqlCommand;  
        private SqlDataReader _sqlDataReader;  
        private string _strsqlcommand;   
 #endregion 
  #region Method for Getting the data from Database  
        public void LoadData()  
        {  
            try  
            {  
            // Connection Strings 
            // Connecting to DB 
             _sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString);  
                if (_sqlConnection.State != ConnectionState.Open)  
                    _sqlConnection.Open();  
                _strsqlcommand = "Your Query";
                _sqlDataReader = _sqlCommand.ExecuteReader();  
                var studentmodellist = new ObservableCollection<StudentModel>();  
  
                while (_sqlDataReader.Read())  
                {  
                    var studentModel = new StudentModel  
                    {  
                        StudentId  = _sqlDataReader.GetInt32(_sqlDataReader.GetOrdinal("StudentId ")),  
                        Name= _sqlDataReader.GetString(_sqlDataReader.GetOrdinal("Name")),  
                        Age= _sqlDataReader.GetInt32(_sqlDataReader.GetOrdinal("Age")),  
                        Major = _sqlDataReader.GetString(_sqlDataReader.GetOrdinal("Major"))  
                    };  
                    studentmodellist.Add(studentModel);  
                }  
  
                StudentList = studentmodellist;  
                _sqlConnection.Close();  
            }  
            catch (Exception exception)  
            {  
                MessageBox.Show("DataLoading Failed beacause of following  Reason \n" + exception.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);  
            }  
        }   
        #endregion  

Пожалуйста, обратитесь к ТАК нить для получения дополнительной информации.