2016-03-19 9 views
1

値:エンティティとDTOモデルを塗りつぶし、私は以下のDTO持っ

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

をそして、私は、次のEntity Frameworkのエンティティを持っている:

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

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リストを持っています

これらの電子書籍ごとに、DocumentIdとCoverIdを取得する必要があります。

contexts.EbooksFilesで
  1. は、(1)からEbook.Id = DTO.EbookId;
  2. を持っているものを取得するには、各EbookFileのファイルのIdsを取ります。
  3. context.Filesで見つけたのは、(2)で取得したIDを持つものです。
  4. EbookDTODocumentIdは「Document」という名前のファイルで、EbookDTOCoverIdはCoverという名前のファイルになります。

私は、次のようないくつかのクエリを試してみました:

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

をしかし、私は、ファイル名をテストし、そのIDを取得し、各EbookDTODocumentIdCoverIdの定義に追加するかどうかはわかりません。

答えて

1

EbookFileからクエリを開始して、これを必要以上に困難にしています。 1つのEbookには複数のがあるので、1つを構築するために必要な2つのレコードを収集するために何らかの形式のグループ化が必要ですEbookDTO。あなたはEbookからクエリを開始すると

、このグループ化は自然に提供されています。私は、このナビゲーションプロパティEbookFilesEbookに存在することを仮定してい

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

、そうでない場合、私はそれを作成することをお勧めしたいです。