我正在使用Entity Framework,我正在尝试使用以下代码将实体映射到dto对象,但出现了问题:
var fileUploads = _dbContext.FileUploads.Include("DocumentType").Include("Store");
if (jobSearchParams.DocumentTypeId != null)
{
fileUploads = fileUploads.Where(x => x.DocumentTypeID == 6);
}
if (jobSearchParams.StoreId != null)
{
fileUploads = fileUploads.Where(x => x.StoreID == jobSearchParams.StoreId);
}
if (!string.IsNullOrEmpty(jobSearchParams.Name))
{
fileUploads = fileUploads.Where(d => d.Name.Contains(jobSearchParams.Name));
}
var dtos = Mapper.Map<IEnumerable<JobDocumentDto>>(documents);
var cnt = fileUploads.Count(); // 1412
var fileDocuments = fileUploads.AsEnumerable().Select(d => new JobDocumentDto
{
DocumentID = d.ID,
StoreID = d.StoreID,
StoreName = d.Store.Name,
Document = Mapper.Map<DocumentDto>(d),
DocumentName = d.Name
}).ToList();
cnt = fileDocuments.Count; // 0
使用表达式中的AsEnumerable
,我在执行select后有0个对象,如果删除AsEnumerable
,我会收到以下错误:
System.NotSupportedException:LINQ to Entities无法识别 方法&#39; DataManagement.DTOs.DocumentDto MapDocumentDto&#39;方法,这个方法不能 翻译成商店表达
答案 0 :(得分:2)
在选择之前添加.ToList()
,因此请将其设为.ToList().Select(...)...
。
原因:LINQ正在尝试将整个
new JobDocumentDto {...}
语句转换为查询形式,但它不能。通过先前运行查询,可以避免此问题。
此外AsEnumerable()
现在可能是多余的,只需尝试将其删除即可。