我无法使用 ValueInjecter 在我的 Entity Framework 查询中直接转换对象

I can't directly cast object in my Entity Framework query using 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;

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

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