我正在尝试使用ValueInjecter将实体映射到asp.net核心项目中的DTO。
有人可以向我解释为什么这可行吗
var list = _context.Assets
.ToList();
var vm = list
.Select(a => new ViewModel().InjectFrom(a))
.Cast<ViewModel>()
.ToList();
return vm;
但这不是:
var list = _context.Assets
.Select(a => new ViewModel().InjectFrom(a))
.Cast<ViewModel>()
.ToList();
return list;
这是ValueInjecter错误吗?我在做错什么吗?
Automapper是否可以解决这个问题?与Automapper相比,我强烈更喜欢valueinjecter语法。
感谢您的帮助!
编辑:
@Chris Pratt:感谢您的快速回答。但是,当我手动映射属性时(如下面的示例),为什么它会起作用?我仍在将此映射应用于不在内存中的IQueryable接口。
那为什么行得通?
var vm = _context.Assets
.Select(a => new ViewModel
{
Id = a.Id,
Code = a.Code
})
.AsNoTracking()
.ToList();
return vm;
答案 0 :(得分:1)
我还没有使用ValueInjector,但是我想它可以归结为第一个示例中的Select
在内存中应用和第二个示例中的查询。动态映射是无法在数据库级别完成的,特别是,EF必须能够将您在Select
,Where
等中传递的内容转换为SQL。使用ValueInjector代码将无法执行此操作,因此无法构造满足LINQ表达式的查询。在第一个示例中没有这个问题,因为先从数据库 中提取实体,然后映射这些内存中实例。
就其价值而言,AutoMapper在这里也会有同样的问题,因此从技术上讲它不是映射提供程序的问题-只是要在其中运行操作的位置之一(即内存与数据库中的操作)。