我有以下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;
EbookFile
的文件ID; context.Files
中查找有(2)中的Ids的内容; EbookDTO
DocumentId
都是名称为&#34;文档&#34;并且EbookDTO
CoverId
将是名为Cover的文件。 我尝试了一些问题,例如:
context
.EbooksFiles
.Where(x => ebooks.Select(y => y.Id).Contains(x.EbookId))
但我不确定如何测试文件名,获取其ID并添加定义每个DocumentId
的{{1}}和CoverId
。
答案 0 :(得分:1)
您从EbookFile
开始查询,从而使此操作变得更加困难。一个EbookFile
有多个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
,否则我建议您创建它。