使用实体值

时间:2016-03-19 17:36:17

标签: c# entity-framework

我有以下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. 在contexts.EbooksFiles中获取Ebook.Id = DTO.EbookId;
  2. 的内容
  3. 从(1)中取出每个EbookFile的文件ID;
  4. context.Files中查找有(2)中的Ids的内容;
  5. 每个EbookDTO DocumentId都是名称为&#34;文档&#34;并且EbookDTO CoverId将是名为Cover的文件。
  6. 我尝试了一些问题,例如:

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

    但我不确定如何测试文件名,获取其ID并添加定义每个DocumentId的{​​{1}}和CoverId

1 个答案:

答案 0 :(得分:1)

您从EbookFile开始查询,从而使此操作变得更加困难。一个EbookFile有多个Ebook个,因此您需要某种形式的分组来收集构建一个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,否则我建议您创建它。