如何将IQueryable / IEnumerable结果转换为自定义模型C#EntityFramework

时间:2019-05-11 22:16:44

标签: c# entity-framework-core

让我们说我有一个具有此功能的存储库

public async Task<IEnumerable<Contacts>> GetAll()
 {
     return await _context.Contacts.ToListAsync();
 }

其中Contacts实体与返回呼叫的实体相同。但是我不想使用同一个类,因为有些字段我希望避免调用。我可以通过任何方式“镜像”另一个名为“ ContactsModel”的模型,而无需使用匿名调用来返回数据:

var result = context.t_validation.Where(a => a.isvalidated == 10).Select(x => new
                {
                    x.date_released,
                    x.utoken,
                    x.Images,
                    x.images_key,
                    x.Type
                });

进入循环并传递给这个新模型:

foreach (var item in list)
                {
                    decp.Add(new ValidationModel
                    {
                        uToken = item.utoken,
                        Date = item.date_released,
                        Images = bc.Decrypt(item.Images, item.images_key),
                        Type = item.Type
                    });
                }

谢谢!

1 个答案:

答案 0 :(得分:2)

由于您正在使用自定义方法解密图像,因此您将无法将其包含在查询中,因为EF无法将其转换为sql查询。

匿名方法将是最好的方法

public async Task<IEnumerable<Contacts>> GetAll()
{
    var models = await _context
        .Contacts
        .Select(contact => new
        {
            contact.date_released,
            contact.utoken,
            contact.Images,
            contact.images_key,
            contact.Type        
        })
        .ToListAsync()

    return models
        .Select(item => new ValidationModel
        {
            uToken = item.utoken,
            Date = item.date_released,
            Images = bc.Decrypt(item.Images, item.images_key),
            Type = item.Type
        }
        .ToList();   
}

您当然可以使用扩展方法将其包装起来,但是如果仅在一个地方使用此映射,则不需要。