Как преобразовать тип IEnumerable в тип списка?

#c# #linq #linq-to-sql #ado.net

#c# #linq #linq-to-sql #ado.net

Вопрос:

Я пытаюсь получить определенные значения базы данных и сохранить их в datatable. После этого я применяю linq для группировки по всем данным с номером счета. Я сохраняю конечный результат в списке следующего типа класса —

   class ListItems
    {
        public string accountNumbers
        {
            get;
            set;
        }
         
        public string itemNumbers
        {
            get;
            set;
        }

    }

  

Мой код :

 List<ListItems> accounts = new List<ListItems>();

        public void GetItems(int ID1, int ID2)
        {
            con = new SqlConnection(connection);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "sp_FetchItems";
            cmd.Parameters.AddWithValue("@id1", ID1);
            cmd.Parameters.AddWithValue("@id2", ID2);
            cmd.Connection = con;
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            adp.Fill(dt);

            accounts = from result in dt.AsEnumerable() 
                       group result by result.Field<string>("accountNumber");
           
        }

  

Я получаю следующую ошибку

Не удается неявно преобразовать тип ‘System.Коллекции.Общий.IEnumerableIGrouping<string, System.Data.DataRow>>’ в’System .Коллекции.Generic.ListListItems>

на линии

  accounts = from result in dt.AsEnumerable() 
                       group result by result.Field<string>("accountNumber");
  

Я даже пытался преобразовать это выражение с помощью ToList(), но оно также не работает.

Комментарии:

1. Проблема не в IEnumerable => List, а в том, что ваши общие классы также несовместимы. Не зная, что находится в вашем потоке данных, на этот вопрос нельзя ответить

2. Чего вы пытаетесь достичь — один ListItems на много строк? Если это так, то свойства, вероятно, должны быть другого типа, массивы или IEnumerable<string> , а не просто string .

3. Если вы хотите, чтобы объекты возвращались из ADO, почему бы вам не использовать ORM, подобный Dapper?

4. Я не мог понять ваш вопрос. Вы спрашиваете, какие значения хранятся в моей таблице данных?

5. @RicardoPeres В моей базе данных в моих таблицах хранится номер учетной записи, соответствующий которому у меня много элементов. я просто извлекаю их и сохраняю в datatable . Теперь я хочу сгруппировать по этим элементам с соответствующими номерами учетных записей и сохранить результат в списке моего типа класса.

Ответ №1:

Попробуйте это:

 class ListItem
{
    public string accountNumber { get; set; }
     
    public List<string> itemNumbers { get; set; }
}

accounts = (from result in dataTable.AsEnumerable() group result by result.Field<string>("accountNumber") into g select new ListItems { accountNumber = g.Key, itemNumbers = g.Select(x => x.Field<string>("<itemNumber>")).ToList() }).ToList();
  

Объяснение в порядке:

  1. Я изменил ваш ListItems класс на ListItem и itemNumbers свойство на тип List<string>
  2. Я группирую все элементы (я не знаю имени столбца в вашей базе данных) в один ListItem экземпляр, сгруппированный по accountNumber столбцу, и сохраняю все элементы в itemNumbers свойстве

Комментарии:

1. Извините, забыл изменить на list (.ToList()) .

2. спасибо, это сработало, но просто пытаюсь понять, что я делал не так?

3. Что ж, метод расширения AsEnumerable() DataTable возвращает экземпляры DataRow, которые затем необходимо сгруппировать, как вы и делали. Тогда для каждого элемента в группе, возможно, будет много элементов, поэтому вам нужно выбрать их все. Попробуйте проанализировать код, и вы поймете его лучше, чем я могу объяснить! 🙂

4. Большое спасибо! Я буду усердно работать, чтобы закрепить свои основы.