2016-03-19 3 views
1

У меня есть следующий DTO:Наполните модели DTO с сущностями значения

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

И у меня есть следующие Entity Framework объекты:

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;
  3. Найти в context.Files те, у которых есть идентификаторы, взятые в (2);
  4. Каждый EbookDTODocumentId будет файлом с названием «Документ», а EbookDTOCoverId будет с именем Cover.

Я попробовал несколько запросов, таких как:

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

Но я не уверен, как проверить имя файла, получить его идентификатор и добавить определение DocumentId и CoverId каждого EbookDTO.

ответ

1

Вы делаете это сложнее, чем необходимо, запустив запрос от EbookFile. Есть несколько EbookFile s для одного 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, в противном случае я бы рекомендовал создать его.

Смежные вопросы