我无法使用ValueInjecter

时间:2019-03-26 19:09:18

标签: casting asp.net-core-mvc valueinjecter

我正在尝试使用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;

1 个答案:

答案 0 :(得分:1)

我还没有使用ValueInjector,但是我想它可以归结为第一个示例中的Select在内存中应用和第二个示例中的查询。动态映射是无法在数据库级别完成的,特别是,EF必须能够将您在SelectWhere等中传递的内容转换为SQL。使用ValueInjector代码将无法执行此操作,因此无法构造满足LINQ表达式的查询。在第一个示例中没有这个问题,因为先从数据库 中提取实体,然后映射这些内存中实例。

就其价值而言,AutoMapper在这里也会有同样的问题,因此从技术上讲它不是映射提供程序的问题-只是要在其中运行操作的位置之一(即内存与数据库中的操作)。