我有以下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:
- 在上下文中。电子书文件获取具有
Ebook.Id
=DTO.EbookId;
- 从(1)获取每个
EbookFile
的文件ID; - 在
context.Files
中找到那些已经吸收了 ID 的 (2); - 每个
EbookDTO
DocumentId
都是名为"文档"的文件,EbookDTO
CoverId
将是名为封面的文件。
我尝试了一些查询,例如:
context
.EbooksFiles
.Where(x => ebooks.Select(y => y.Id).Contains(x.EbookId))
但是我不确定如何测试文件名,获取其id并添加定义每个EbookDTO
的DocumentId
和CoverId
。
通过从EbookFile
启动查询,您使这变得比必要的困难。一个Ebook
有多个EbookFile
,所以你需要某种形式的分组来收集构建一个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
中,否则我建议创建它。