Как назначить список, полученный Dapper, свойствам в моей модели классов? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть класс модели, который имеет ряд открытых свойств (имя, адрес и т. Д.). Эти свойства точно соответствуют столбцам в базе данных SQL. У меня есть форма, которая позволяет пользователю вводить идентификационный номер клиента и по щелчку передает идентификатор клиента методу в классе бизнес-логики, который, в свою очередь, вызывает общий класс доступа к данным, который использует Dapper Query для возврата клиента запись из базы данных SQL. Этот результат привязан к сетке данных и работает нормально.

(так что все работает нормально: Форма> BLClass> DataAccessClass> BLClass> Форма)

Однако в моем классе бизнес-логики мне бы хотелось иметь доступ ко всем свойствам в моем классе моделей, чтобы я мог создавать отчеты и выполнять некоторые вычисления. Я могу создать новый пустой экземпляр моего класса модели, и все свойства появляются после точки в intellisense, но когда я пытаюсь получить доступ к фактическому списку, возвращенному классом DataAccess, который имеет тип List, я не могу установить или получить любое из свойств в классе модели.

Примечание. Мой метод бизнес-класса был запущен как открытый метод void, но для того, чтобы вернуть список в форму для использования в представлении данных, мне нужно было создать метод "public List CreateReport (int ClientID);" Меня не волнует отображение результата в форме - я всегда могу заполнить его отдельно. Мне просто нужно иметь возможность заполнять свойства класса модели внутри класса бизнес-логики, чтобы я мог использовать их в отчете.

//The model class
public class ClientModel
{

    public int ClientID { get; set; }
    public string ClientPosition { get; set; }
    public string Fname { get; set; }
    public string MName { get; set; }
    public string LName { get; set; }
    //etc.  
}

//The business logic class 

public void CreateReport(int ClientID);

List<ClientModel> client = DataConfig.Connection.GetClientByID(ClientID).ToList();

string ClientName = (client.FName + " " + client.MName + " " + client.LName).ToUpper();
string ClientNameFooter = client.FName + " " + client.MName + " " + client.LName;

//Etc., with the int's and strings eventually replacing bookmarked sections in a Word template using Word.Interop.

Когда я пытаюсь получить доступ к client.Fname, я получаю сообщение об ошибке «Список» не содержит определения для «FName», и невозможно найти доступный метод расширения «FName», принимающий первый аргумент типа «Список». "

Я попытался назначить переменную списка «client» пустому экземпляру модели Client, но получил ошибку «Не удается неявно преобразовать тип« ReportGenerator.ClientModel »в« System.Collections.Generic.List.ReportGenerator.ClientModel » .

Впервые в C # и Dapper, так что это может быть что-то совершенно очевидное, что мне не хватает в объекте списка.

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Ваша переменная client - это список. В списке нет имени Fname. Вы можете сделать

client[0].Fname

или индексировать его другим способом.

Поскольку вы новичок, вот еще несколько советов:

  • Сделайте себе и тем, кому нужно поддерживать код после вашего одолжения, и используйте длинные имена переменных / свойств. Так что FirstName вместо Fname.
  • Будьте последовательны. Не называйте одно свойство Fname, а другое MName.
  • По соглашению локальные переменные начинаются со строчных букв: clientName, а не ClientName.
  • Использовать интерполяцию строк:

    string clientName = "{client.FName} {client.MName} {client.LName}".ToUpper(); 
    

EDIT : Глядя на ваш вопрос еще раз, я думаю, что вы хотите использовать FirstOrDefault или Single. FirstOrDefault примет первый элемент в вашем списке или по умолчанию (ноль), если список пуст. Single возьмет ровно один предмет, если он есть, и в противном случае выдаст исключение.

ClientModel client = DataConfig.Connection.GetClientByID(ClientID).Single();

Тогда вам не придется повторять или индексировать список.

0 голосов
/ 04 июня 2019

Я заметил, что вы передаете ClientId ... звучит уникально .. поэтому, возможно, вам нужен не этот список ..

public void CreateReport(int ClientID)
{
    try
    {
         ClientModel client = DataConfig.Connection.GetClientByID(ClientID).FirstOrDefault();

         if(client != null)
         {
             string ClientName = (client.FName + " " + client.MName + " " + client.LName).ToUpper();
             string ClientNameFooter = client.FName + " " + client.MName + " " + client.LName;

             Debug.WriteLine("ClientName: {0}", ClientName);
             Debug.WriteLine("ClientNameFooter: {0}", ClientNameFooter);
         }
         else
         {
             Debug.WriteLine("Couldn't find a client with that Id...");
         }
    }
    catch (Exception ex)
    {
         throw new Exception(ex.Message);
    }
}
0 голосов
/ 04 июня 2019

Я бы использовал Dapper, как описано в руководстве здесь: https://dapper -tutorial.net / query

string sql = "SELECT TOP 10 * FROM ClientModels";

using (var connection = new SqlConnection("your connection string"))
{           
    var clientModels = connection.Query<ClientModel>(sql).ToList();
    foreach(var clientModel in clientModels)
    {
        // do something with clientModel
        ...
    }
}
...