我需要从表中获取特定的原始列值。我按如下方式编写代码:
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>
吗?如果我使用返回类型作为字符串,这不是一个好的做法吗?
发布于 2019-10-18 05:03:36
您必须使用.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();
等
在select中,r表示由上下文传递的表行,因此r中的列名将是您在映射中设置的名称。您没有显示映射,所以我不知道您的一些列名是什么
这不是抛出的唯一方法,您还可以在Dto中提供一个构造函数,该构造函数接受表示实体的类型的对象,然后在构造函数中设置属性。这通常不太常见,因为它将您的Dto对象套件绑定为依赖于您的实体域,并且它们可能应该是分开的。您可以在运行此查询的存储库类中创建一个Map方法;map接受一个db实体并返回一个dto;这取决于您将执行此操作的次数-如果这是您查询此表并创建模板数据列表的唯一位置,则没有必要为其创建映射方法。
归根结底,最初的问题是您的原始查询返回一个db实体对象列表,并且它们不能直接分配给一个声明为只有一个dto对象列表的列表,因为它们是不同的对象。就像将汽车类型对象的列表分配给列表一样-相反,您必须使用Select从数据实体生成Dto。Dto通常是不同的、更轻的、更少的属性,可能是一些不在数据库中的计算属性(如dto具有Age,数据库具有bitthdaye),并用于将少量数据移动到其他位置,甚至可能通过网络,因此它们更小
https://stackoverflow.com/questions/58444186
复制相似问题