system.linq.enumaerable + - PullRequest
       0

system.linq.enumaerable +

0 голосов
/ 06 марта 2020

У меня есть запрос SQL, который считывает строковые данные из базы данных SQL Express (переключение на Azure). После получения данных я считываю их в массив, а затем отображаю содержимое массива в поле со списком. однако я не получаю никакой ошибки, в поле со списком отображается дополнительное поле, и я не могу понять, как это предотвратить.

У меня есть класс для массива, созданного с помощью {get; набор;}. Ниже приведен актуальный код для основной программы:

LocationList[] address1 = null;

string sql = @"SELECT Address1 FROM DN";

using (var cmd = new SqlCommand(sql, connectionString))
{
    connectionString.Open();
    using (var sqlReader = cmd.ExecuteReader())
    {
        var list = new List<LocationList>();
        while (sqlReader.Read())
        {
            list.Add(new LocationList { Address1 = sqlReader.GetString(0) });
        }
        address1 = list.Distinct().ToArray();
        sqlReader.Close();
    }
    connectionString.Close();  
}

cbTransferTo.Items.Add(address1.Cast<string>());

enter image description here

Кроме того, каждый раз, когда я нажимаю на раскрывающийся список, добавляется дополнительный элемент без меня, чтобы запустить и остановить программу. Это не должно делать это, и я не могу найти проблему.

Что нужно сделать программе, это только отобразить содержимое, которое она получает из таблицы базы данных SQL, которая представляет собой список местоположений.

Ваша помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Вы добавляете отдельный элемент в комбинированный список, но этот единственный элемент является возвращаемым значением из Cast<string>(), которое является последовательностью. Тип не переопределяет ToString(), поэтому вместо него вы получаете имя типа.

Я думаю, вам нужно добавить все элементы в выпадающий список:

foreach (var location in address1)
{
    cbTransferTo.Add(location.Address1);
}

Обратите внимание, что если вы просто выполните итерацию по результату Cast<string>(), я все равно ожидал бы исключение - потому что address1 - это последовательность LocationList элементов, а не строк. Хотя не совсем понятно, почему вы используете LocationList - я подозреваю, что было бы проще просто использовать строку для начала. Более простой код:

string sql = @"SELECT Address1 FROM DN";

List<string> addresses = new List<string>();
using (var cmd = new SqlCommand(sql, connectionString))
{
    connectionString.Open();
    using (var sqlReader = cmd.ExecuteReader())
    {
        while (sqlReader.Read())
        {
            addresses.Add(sqlReader.GetString(0));
        }
    }
    connectionString.Close();  
}

foreach (var address in addresses.Distinct())
{
    cbTransferTo.Add(address);
}

Было бы еще лучше использовать DISTINCT в вашем SQL, чтобы вы могли заставить базу данных выполнять дедупликацию, а не извлекать все данные в ваша программа и затем дедупликация ...

0 голосов
/ 06 марта 2020

Вызов address1.Cast<string>() возвращает IEnumerable реализующий тип, а не строку. Вы добавляете этот тип в поле со списком, и он визуализируется с помощью вызова ToString, который возвращает имя типа.

Как таковой, ваш код содержит ошибки. address1 - это последовательность LocationList, а не string. Поскольку вызов Cast ленивый, вы не увидите ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...