用实体值填充 DTO 模型



我有以下DTO:

public class EbookDTO {
  public Int32 EbookId { get; set; }
  public Int32 CoverId { get; set; }
  public Int32 DocumentId { get; set; }
}

我有以下实体框架实体:

public class EbookFile {
  public Int32 EbookId { get; set; }
  public Int32 FileId { get; set; }
  public virtual Ebook Ebook { get; set; }
  public virtual File File { get; set; }
}
public class File {
  public Int32 Id { get; set; }
  public Int32 EbookFileId { get; set; }
  public String Name { get; set; }
  public virtual EbookFile EbookFile { get; set; }
}

我有以下EbookDTO列表:

List<EbookDTO> ebooks = new List<EbookDTO>() {
  new EbookDTO { Id = 1 },
  new EbookDTO { Id = 2 }
}

对于这些电子书中的每一本,我都需要获取它们的 DocumentId 和 CoverId:

  1. 在上下文中。电子书文件获取具有 Ebook.Id = DTO.EbookId;
  2. 从(1)获取每个EbookFile的文件ID;
  3. context.Files中找到那些已经吸收了 ID 的 (2);
  4. 每个EbookDTO DocumentId都是名为"文档"的文件,EbookDTO CoverId将是名为封面的文件。

我尝试了一些查询,例如:

context
  .EbooksFiles
  .Where(x => ebooks.Select(y => y.Id).Contains(x.EbookId))

但是我不确定如何测试文件名,获取其id并添加定义每个EbookDTODocumentIdCoverId

通过从EbookFile启动查询,您使这变得比必要的困难。一个Ebook有多个EbookFile,所以你需要某种形式的分组来收集构建一个EbookDTO所需的两个记录。

如果从 Ebook 开始查询,则自然会提供此分组:

var ebookIds = ebooks.Select(y => y.Id).ToArray();
from eb in context.Ebooks
where ebookIds.Contains(eb.EbookId)
select new EbookDTO
{
    EbookId = eb.EbookId,
    CoverId = eb.EbookFiles.FirstOrDefault(ebf => ebf.File.Name == "Cover").FileId,
    DocumentId = eb.EbookFiles.FirstOrDefault(ebf => ebf.File.Name == "Document").FileId,
}

我假设这个导航属性EbookFiles存在于Ebook中,否则我建议创建它。

相关内容

  • 没有找到相关文章

最新更新