使用select将实体框架实体映射到dto对象

时间:2016-04-01 11:45:24

标签: c# entity-framework

我正在使用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;方法,这个方法不能   翻译成商店表达

1 个答案:

答案 0 :(得分:2)

在选择之前添加.ToList(),因此请将其设为.ToList().Select(...)...

  

原因:LINQ正在尝试将整个new JobDocumentDto {...}语句转换为查询形式,但它不能。通过先前运行查询,可以避免此问题。

此外AsEnumerable()现在可能是多余的,只需尝试将其删除即可。