Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 在AutoMapper和实体框架中做算法_C#_Entity Framework_Exception_Automapper - Fatal编程技术网

C# 在AutoMapper和实体框架中做算法

C# 在AutoMapper和实体框架中做算法,c#,entity-framework,exception,automapper,C#,Entity Framework,Exception,Automapper,我很难将POCO对象投影到DTO对象 public sealed class ClientEventDTO { public int LogEntryId { get; set; } public string Username { get; set; } public string ServerName { get; set; } public DateTime LoginTime { get; set; } public TimeSpan Connec

我很难将POCO对象投影到DTO对象

public sealed class ClientEventDTO
{
    public int LogEntryId { get; set; }
    public string Username { get; set; }
    public string ServerName { get; set; }
    public DateTime LoginTime { get; set; }
    public TimeSpan ConnectedFor { get; set; }
    public string LogNote { get; set; }

    public TimeSpan IdleForWithLast { get; set; }
}
我的POCO对象

public class LogEntry
{
    public LogEntry()
    {
        this.Username = Environment.UserName;
        this.LogNote = String.Empty;

        var now = DateTime.Now;
        this.LoginTime = now;
        this.LastSeenInput = now;
        this.ServerName = Environment.MachineName;
    }

    public int LogEntryId { get; set; }

    [Required(AllowEmptyStrings = false)]
    [Column(TypeName = "nvarchar")]
    [MaxLength(64)]
    public string Username { get; set; }

    [Required(AllowEmptyStrings = true)]
    [Column(TypeName = "varchar")]
    [MaxLength(20)]
    public string ServerName { get; set; }

    public DateTime LoginTime { get; set; }
    public TimeSpan ConnectedFor { get; set; }
    public TimeSpan IdleFor { get; set; }
    public DateTime? LastSeenInput { get; set; }

    [Required(AllowEmptyStrings = true)]
    public string LogNote { get; set; }
}
我的DTO对象

public sealed class ClientEventDTO
{
    public int LogEntryId { get; set; }
    public string Username { get; set; }
    public string ServerName { get; set; }
    public DateTime LoginTime { get; set; }
    public TimeSpan ConnectedFor { get; set; }
    public string LogNote { get; set; }

    public TimeSpan IdleForWithLast { get; set; }
}
我想做的是,我想用
IdleForWithLast
来表示

public TimeSpan IdleForWithLast
{
    get
    {
        var tmp = IdleFor;
        if (LastSeenInput.HasValue)
            tmp = tmp.Add(DateTime.Now - LastSeenInput.Value);
        return tmp;
    }
}
但是当我这么做的时候

static void Main(string[] args)
{
    Mapper.CreateMap<LogEntry, ClientEventDTO>()
        .ForMember(dto => dto.IdleFor, 
                   a => a.MapFrom(ent => ent.LastSeenInput == null ? 
                                            ent.IdleFor : 
                                            ent.IdleFor + (DateTime.Now - ent.LastSeenInput.Value)
                                 )
                  );

    Mapper.AssertConfigurationIsValid();

    using (var ctx = new LoginHistoryContext())
    {
        var username = "Scott";

        var query = ctx.LogEntries.Where(entry => entry.Username == username).Project().To<ClientEventDTO>();
        var result = query.ToList();

        Debugger.Break();
    }
}

这是我在这种情况下可能会用到的解决方法,但我想知道将来如何处理这一问题,以防我必须使用
QueryableExtensions
并且需要执行类似操作。

您可以忽略此成员,并在映射后手动映射它:

Mapper.CreateMap<LogEntry, ClientEventDTO>()
      .ForMember(dto => dto.IdleForWithLast, m => m.Ignore())
      .AfterMap((ent, dto) =>
           dto.IdleForWithLast = ent.LastSeenInput.HasValue ?
           ent.IdleFor + (DateTime.Now - ent.LastSeenInput.Value) : ent.IdleFor);
Mapper.CreateMap()
.ForMember(dto=>dto.IdleForWithLast,m=>m.Ignore())
.AfterMap((ent,dto)=>
dto.IdleForWithLast=ent.LastSeenInput.HasValue?
ent.IdleFor+(DateTime.Now-ent.LastSeenInput.Value):ent.IdleFor);
或在映射后更改默认映射:

Mapper.CreateMap<LogEntry, ClientEventDTO>()
      .ForMember(dto => dto.IdleForWithLast, m => m.MapFrom(ent => ent.IdleFor))
      .AfterMap((ent, dto) => {
            if (ent.LastSeenInput.HasValue)
                dto.IdleForWithLast += DateTime.Now - ent.LastSeenInput.Value;
       });
Mapper.CreateMap()
.ForMember(dto=>dto.IdleForWithLast,m=>m.MapFrom(ent=>ent.IdleFor))
.AfterMap((ent,dto)=>{
if(ent.LastSeenInput.HasValue)
dto.IdleForWithLast+=DateTime.Now-ent.LastSeenInput.Value;
});

它不再抛出异常,但对于应该有值的记录,它返回的时间跨度为0。
CustomResolver
方法确实返回了正确的值。@ScottChamberlain对我来说很好。确保您使用的代码与上述代码完全相同。您的问题混合了三元赋值的if-else部分。第二个版本有效,但我仍然无法让第一个版本返回0以外的值,我直接复制并粘贴了它。