C# 自动映射项目使用
我目前正在后端使用automapper将对象映射到模型。 我最近决定使用以下代码来处理我的所有时区转换:C# 自动映射项目使用,c#,.net,entity-framework,linq,automapper,C#,.net,Entity Framework,Linq,Automapper,我目前正在后端使用automapper将对象映射到模型。 我最近决定使用以下代码来处理我的所有时区转换: cfg.CreateMap<DateTime?, DateTime?>() .ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours)); cfg.CreateMap<DateTime, DateTime>() .ProjectUsing(i => DbFunctions.AddHou
cfg.CreateMap<DateTime?, DateTime?>()
.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours));
cfg.CreateMap<DateTime, DateTime>()
.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value);
Object.ProjectTo<ObjectModel>().SingleOrDefault();
Mapper.Map对于在特定场景中使用很重要,我也不想投射单个记录
有办法解决这个问题吗 来自MSDN:
提供公共语言运行时(CLR)方法,这些方法公开EDM canonical>函数,以便在DbContext或ObjectContext LINQ to Entities查询中使用
因此,这个错误是意料之中的,因为在LINQ到实体查询中没有执行投影
dbfunctions.AddHours()
调用被转换为数据库函数。因为在业务层中,您传递的不是实体而是对象,所以会抛出错误
解决此问题有两种方法:
1.在业务层中使用不同的映射逻辑。
2.使用不依赖于
DbFunctions
类的映射逻辑,以便可以在DAL和业务层中使用它。默认情况下,AutoMapper将通过编译传递给项目的表达式来构建映射Func>
以供Map
方法使用ProjectTo
,因为通常这就足够了。但不是EF正则函数
您可以通过明确提供ProjectUsing
和ConvertUsing
来指定要与Map
方法一起使用的不同转换来覆盖该行为:
var map1 = cfg.CreateMap<DateTime?, DateTime?>();
map1.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours));
map1.ConvertUsing(i => i?.AddHours(offset.Hours));
var map2 = cfg.CreateMap<DateTime, DateTime>();
map2.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value);
map2.ConvertUsing(i => i.AddHours(offset.Hours));
var map1=cfg.CreateMap();
ProjectUsing(i=>DbFunctions.AddHours(i,offset.Hours));
map1.ConvertUsing(i=>i?.AddHours(offset.Hours));
var map2=cfg.CreateMap();
ProjectUsing(i=>DbFunctions.AddHours(i,offset.Hours.Value);
map2.ConvertUsing(i=>i.AddHours(offset.Hours));
Hey@ivan,谢谢你的回答,我认为这是可行的,我正在实现它。你能给我解释一下:projectusing是否在数据库级别运行吗?Convert是否在Cpu级别运行?EF规范函数的含义和作用是什么?(1)EF规范函数是来自DbFunctions
的函数。正如你所注意到的,他们不是要被处决的。就像IQueryable
表达式树中已知的“占位符”,EF查询转换器将它们映射到SQL查询中相应的数据库函数调用。(2) 是的,因为ConvertUsing
接收到Func
(read-code>),它不能映射到SQL,所以它被Map
方法使用,这些方法在内存对象上操作。你是一个传奇伊万!你是在找一份全职工作吗?地点是杜拜合,谢谢,很高兴它帮助了你。不,谢谢,但我喜欢我现在住的地方:)
at System.Data.Entity.DbFunctions.AddHours(Nullable`1 timeValue, Nullable`1 addValue)
at lambda_method(Closure , DateTime , DateTime , ResolutionContext )
at AutoMapper.ResolutionContext.Map[TSource,TDestination](TSource source, TDestination destination)
at lambda_method(Closure , Inventory , InventoryModel , ResolutionContext )
var map1 = cfg.CreateMap<DateTime?, DateTime?>();
map1.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours));
map1.ConvertUsing(i => i?.AddHours(offset.Hours));
var map2 = cfg.CreateMap<DateTime, DateTime>();
map2.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value);
map2.ConvertUsing(i => i.AddHours(offset.Hours));