2016-03-19 5 views
1

Ich habe folgendes DTO:Füllen DTO Modelle mit Einheiten Werte

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

Und ich habe folgende Entity Framework Entitäten:

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; } 
} 

Ich habe die folgende EbookDTO Liste:

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

Ich brauche für jedes dieser E-Books ihre DocumentId und CoverId:

  1. In contexts.EbooksFiles bekommen diejenigen, die Ebook.Id = DTO.EbookId;
  2. Aus (1) nehmen Sie die Dateien Ids jedes EbookFile hat;
  3. Finden Sie in context.Files diejenigen, die die Ids aufgenommen haben (2);
  4. Jede EbookDTODocumentId wäre die Datei mit dem Namen "Document" und die EbookDTOCoverId wäre die Datei mit dem Namen Cover.

habe ich versucht, ein paar Fragen wie:

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

Aber ich bin nicht sicher, wie den Dateinamen zu testen, seine ID erhalten und die DocumentId und CoverId jedes EbookDTO definieren hinzuzufügen.

Antwort

1

Sie machen dies schwieriger als notwendig, indem Sie die Abfrage von EbookFile starten. Es gibt mehrere EbookFile s für eine Ebook, so dass Sie eine Form der Gruppierung benötigen, um die zwei Datensätze zu sammeln, die Sie benötigen, um eine EbookDTO zu erstellen.

Wenn Sie die Abfrage von Ebook starten, wird diese Gruppierung natürlich zur Verfügung gestellt:

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, 
} 

Ich gehe davon aus, dass diese Navigationseigenschaft EbookFiles in Ebook existiert, sonst würde ich es schaffen empfehlen.