首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将EF表数据分配给列表

如何将EF表数据分配给列表
EN

Stack Overflow用户
提问于 2019-10-18 12:58:41
回答 1查看 184关注 0票数 0

我需要从表中获取特定的原始列值。我按如下方式编写代码:

代码语言:javascript
运行
复制
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;
}

但是上面的代码给出了这个错误,

代码语言:javascript
运行
复制
cannot convert from 'System.Collections.Generic.List<Kronos.FMSI.LT.EFModel.ClientData.MessageTemplate>' to 'Kronos.FMSI.LT.Api.Interface.Models.Notification.MessageTemplateDto'

我的DTO类如下所示,

代码语言:javascript
运行
复制
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>吗?如果我使用返回类型作为字符串,这不是一个好的做法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-18 13:03:36

您必须使用.Select()创建新的MessageTemplateDto并设置要填充的每个属性:

代码语言:javascript
运行
复制
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),并用于将少量数据移动到其他位置,甚至可能通过网络,因此它们更小

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58444186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档