Как назначить данные таблицы EF списку - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно получить конкретное необработанное значение столбца из таблицы. Я пишу код следующим образом,

public List<MessageTemplateDto> GetMessageTemplate(int tenantId,NotifyVia notifyVia,string notifyEvent)
{

    ClientContext context = clientContextFactory.GetContext(tenantId);
    List<MessageTemplateDto> msgTemplate = new List<MessageTemplateDto>();
    var xx = context.MessageTemplates.Where(m => m.NotifyEvent == notifyEvent && m.SendVia == notifyVia.ToString()).ToList();
    msgTemplate.Add(xx);
    return msgTemplate;
}

Но приведенный выше код дает эту ошибку,

cannot convert from 'System.Collections.Generic.List<Kronos.FMSI.LT.EFModel.ClientData.MessageTemplate>' to 'Kronos.FMSI.LT.Api.Interface.Models.Notification.MessageTemplateDto'

мой класс DTO следующим образом,

public class MessageTemplateDto
{
    public int TemplateID { get; set; }
    public string NotifyEvent { get; set; }
    public string SendVia { get; set; }
    public string Template { get; set; }
}

Что я сделалздесь не так? как я упоминал ранее, мне нужно получить одно значение столбца из необработанного (Template значение). Нужно ли писать тип возвращаемого значения как List<MessageTemplateDto>? Если я использую тип возвращаемого значения в качестве строки, разве это не хорошая практика?

1 Ответ

0 голосов
/ 18 октября 2019

Вы должны использовать .Select (), чтобы создать новый MessageTemplateDto и установить каждое свойство, которое хотите заполнить:

return context.MessageTemplates
  .Where(m => m.NotifyEvent == notifyEvent && m.SendVia == notifyVia.ToString())
  .Select(r => new MessageTemplateDto() {
      TemplateID = r.WhateverTheColumnNameForIdIsInYourMapping,
      r.NotifyEvent //both column and dto property have same name so this can be simplified
      r.SendVia //again, both dto and column seem to have the same name so this can simply be this
      Template = r.WhateverYourColumnNameForTemplateIsInTheContext 
    }
  .ToList();

Etc

Внутри выбора r представляет строку таблицыв зависимости от контекста, имена столбцов в r будут такими, какие вы установили в своем отображении. Вы не показывали mappin, поэтому я не могу сказать, каковы некоторые из имен ваших столбцов

Это не единственный способ бросить, вы можете сделать что-то вроде предоставления конструктора в Dto, который принимаетобъект типа, который представляет сущность, а затем задает свойства в конструкторе. Обычно это делается не так часто, поскольку связывает набор объектов Dto с зависимостью от домена сущности, и они, вероятно, должны быть отдельными. Вы можете создать метод Map в своем классе репозитория, который выполняет этот запрос;map принимает сущность db и возвращает dto;это зависит от того, сколько раз вы будете делать это - если это единственное место, где вы когда-либо будете запрашивать эту таблицу и создавать список шаблонов, то нет смысла создавать для нее метод отображения.

В конечном итоге исходная проблема заключалась в том, что ваш исходный запрос возвращал список объектов-сущностей БД, и их нельзя напрямую назначить списку, объявленному как имеющему только список объектов dto, поскольку они являются разными объектами. Как назначение списка объектов типа автомобиля в список - вместо этого вы должны использовать Select, чтобы сгенерировать Dto из объекта данных. Dto, как правило, разные, более легкие, с меньшим количеством свойств, возможно, некоторые вычисленные свойства, которых нет в БД (например, у dto есть Возраст, в БД есть битный день) и которые используются для перемещения небольшого количества данных в другое место, возможно, дажепо сети, поэтому они меньше

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