#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();
Объяснение в порядке:
- Я изменил ваш
ListItems
класс наListItem
иitemNumbers
свойство на типList<string>
- Я группирую все элементы (я не знаю имени столбца в вашей базе данных) в один
ListItem
экземпляр, сгруппированный поaccountNumber
столбцу, и сохраняю все элементы вitemNumbers
свойстве
Комментарии:
1. Извините, забыл изменить на list (.ToList()) .
2. спасибо, это сработало, но просто пытаюсь понять, что я делал не так?
3. Что ж, метод расширения AsEnumerable() DataTable возвращает экземпляры DataRow, которые затем необходимо сгруппировать, как вы и делали. Тогда для каждого элемента в группе, возможно, будет много элементов, поэтому вам нужно выбрать их все. Попробуйте проанализировать код, и вы поймете его лучше, чем я могу объяснить! 🙂
4. Большое спасибо! Я буду усердно работать, чтобы закрепить свои основы.