2016-03-19 77 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存在,否則我建議你去創造。