2016-03-19 37 views
1

我有以下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. 在contexts.EbooksFiles得到具有Ebook.Id = DTO.EbookId;
  2. 从(1)取各EbookFile的文件ID的那些;
  3. context.Files中查找带有(2)中所带参数的那些;
  4. 每个EbookDTODocumentId将是名为“文档”的文件,并且EbookDTOCoverId将是名称为Cover的文件。

我尝试了一些疑问,例如:

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

但我不知道如何测试的文件名,获得其ID,并添加定义DocumentId每个EbookDTOCoverId

回答

1

通过从EbookFile开始查询,您正在做的比必要的难。有一个Ebook有多个EbookFile s,所以你需要某种形式的分组来收集你需要建立一个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, 
} 

我假设这个导航属性EbookFilesEbook存在,否则我建议你去创造。