【问题标题】:Getting only some columns in DTO class from table by Entity Framework通过实体框架从表中仅获取 DTO 类中的某些列
【发布时间】:2018-11-30 13:28:57
【问题描述】:

我正在使用带有 C# 的实体框架。我的数据库中有一个 Student 表,它有 30 列。而且我只想获取 DTO 类中的某些表列而不写属性名称,如下所示。我怎样才能做到这一点?

我的 DTO 课程:

public class StudentDTO()
{
    public long Name{ get; set; }
    public long Surname{ get; set; }
    public DateTime BirthDate{ get; set; }
    public int StudentNumber{ get; set; }
}

我正在寻找这样的东西:

context.Students.Select(p=> new StudentDTO
{
  ????? StudentDTO.AllProperties  ?????
}).ToList();

请不要建议以下解决方案,因为这不是我想要的。

context.Students.Select(p => new 
                             {
                                 p.Name,
                                 p.Surname,
                                 p.BirthDate,
                                 p.StudentNumber
                             }).ToList();

【问题讨论】:

  • 您已经问过这个问题 2 次了。这是第三个...
  • 没有。这与他们非常不同。 @FCin那个带有字符串属性名称的问题。但在这个问题上,我有另一堂课,我会映射。所以,不一样。我想,你看到类名就说它们是一样的。
  • Students DbSet 的类型和 StduentDTO 是不同的类型吧? linq 选择有什么问题?您可能正在寻找AutoMapper
  • 我不想在从数据库中获取数据时写入属性名称(姓名、姓氏、出生日期、学生编号)。 AutoMapper 从数据库中获取数据后同步两个类。但是,换句话说,我想在从数据库@ibubi 获取数据之前进行查询
  • @HasanOzdemir 它事实上可能:docs.automapper.org/en/stable/Queryable-Extensions.html

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

您尝试过 Automapper 吗?只要 DTO 中的属性名称与 EF 上下文中的名称匹配,就可以了。当您向 DTO 添加属性时,它们会被自动翻译。

如果 DTO 和 EF 上下文之间的名称/类型不匹配,则可能需要在您的映射器配置文件中进行其他配置。

这是一个简化的例子。

 class Program
{
    static void Main(string[] args)
    {
        var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile<MappingProfile>());
        var mapper = mapperConfiguration.CreateMapper();

        var fullStudent = new FullStudent()
        {
            Name = "Mike",
            Surname = "Magoo",
            BirthDate = DateTime.Now,
            StudentNumber = 1,
            Grade = "Freshman",
            PhoneNumber = "555-5555"
        };

        var limitedStudent = mapper.Map<StudentDTO>(fullStudent);

        Console.ReadKey();
    }
}

public class FullStudent
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime BirthDate { get; set; }
    public int StudentNumber { get; set; }

    public string Grade { get; set; }

    public string PhoneNumber { get; set; }
}

public class StudentDTO
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime BirthDate { get; set; }
    public int StudentNumber { get; set; }
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<FullStudent, StudentDTO>();
    }
}

Automapper 可以安装为 nuget 包。

【讨论】:

  • AutoMapper的这种用法是:从数据库中获取数据后同步两个类。但是,换句话说,我想在从数据库中获取数据之前进行查询。 @AlexanderDerck 的解决方案正是我想要的。谢谢。
  • 您应该使用ProjectTo,它将查询的属性限制为 DTO 中的属性。
  • 谢谢@GertArnold。请删除我的副本。因为那个问题不是重复的。
【解决方案2】:

我从@AlexanderDerck 的评论中找到了解决方案。 ProjectTo AutoMapper 的方法解决了我的问题。 docs.automapper.org/en/stable/Queryable-Extensions.html

【讨论】:

  • 如果它解决了您的问题,请随时接受您自己的答案
  • 如果你写,我会删除我的答案,我会将你的答案标记为答案。我写是因为我无法标记评论。 @AlexanderDerck
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2015-01-26
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多