Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射项目使用_C#_.net_Entity Framework_Linq_Automapper - Fatal编程技术网

C# 自动映射项目使用

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

我目前正在后端使用automapper将对象映射到模型。 我最近决定使用以下代码来处理我的所有时区转换:

  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));