我无法使用 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 必须能够将您在 Select
、Where
等中传递的内容转换为 SQL。它无法使用 ValueInjector 代码执行此操作,因此无法构造满足 LINQ 表达式的查询。您在第一个示例中没有这个问题,因为您先从数据库 中提取实体,然后映射这些内存中的实例。
就其价值而言,AutoMapper 在这里会遇到同样的问题,因此从技术上讲这不是映射提供程序问题 - 只是操作将要进行的地方之一 运行(即内存中与在数据库)。
我正在尝试使用 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 必须能够将您在 Select
、Where
等中传递的内容转换为 SQL。它无法使用 ValueInjector 代码执行此操作,因此无法构造满足 LINQ 表达式的查询。您在第一个示例中没有这个问题,因为您先从数据库 中提取实体,然后映射这些内存中的实例。
就其价值而言,AutoMapper 在这里会遇到同样的问题,因此从技术上讲这不是映射提供程序问题 - 只是操作将要进行的地方之一 运行(即内存中与在数据库)。