比较C#ASP.NET MVC LINQ实体框架中的两个列表

比较C#ASP.NET MVC LINQ实体框架中的两个列表,c#,asp.net,asp.net-mvc,linq,C#,Asp.net,Asp.net Mvc,Linq,正如标题所说,我正试图比较已盖销时间和已盖销时间 我有一个flex变量,它将获得一个工作日(8h)内这两个日期之间的差值 “如果我在08:00盖章,在17:00盖章,我的弹性应为+1(h)” 型号: public class FlexModel { public List<User> Users { get; set; } public List<Stamping> Stampings { get; set; } public decimal F

正如标题所说,我正试图比较已盖销时间和已盖销时间

我有一个flex变量,它将获得一个工作日(8h)内这两个日期之间的差值

“如果我在08:00盖章,在17:00盖章,我的弹性应为+1(h)”

型号:

public class FlexModel
{
    public List<User> Users { get; set; }
    public List<Stamping> Stampings { get; set; } 
    public decimal FlexTime { get; set; }
}

public partial class Stamping
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public int UserId { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    public DateTime Timestamp { get; set; }

    [Required]
    [StringLength(3)]
    public string StampingType { get; set; }

    public virtual User User { get; set; }
}

请提供帮助。

您可以这样关联列表:

var attendance = from sin in stampIn
                 select new 
                 {
                    StampIn = sin,
                    StampOut = stampOut.FirstOrDefault(sout => 
                                    sout.Timestamp > sin.Timestamp)
                 };
var flexitime = from att in attendance
                select new
                {
                    TimeIn = att.StampIn.Timestamp,
                    TimeOut = att.StampOut == null ? (DateTime?)null : att.StampOut.Timestamp,
                    TotalTime = att.StampOut == null ? 0 :  
                        att.StampOut.Timestamp.Subtract(att.StampIn.Timestamp).TotalHours
                };
这将为您提供stampin与stampout事件的列表(尽管stampout可能为空)。然后你需要这样计算弹性时间:

var attendance = from sin in stampIn
                 select new 
                 {
                    StampIn = sin,
                    StampOut = stampOut.FirstOrDefault(sout => 
                                    sout.Timestamp > sin.Timestamp)
                 };
var flexitime = from att in attendance
                select new
                {
                    TimeIn = att.StampIn.Timestamp,
                    TimeOut = att.StampOut == null ? (DateTime?)null : att.StampOut.Timestamp,
                    TotalTime = att.StampOut == null ? 0 :  
                        att.StampOut.Timestamp.Subtract(att.StampIn.Timestamp).TotalHours
                };
您现在可以将其转换为
FlexModel
对象(我只填写
FlexTime
属性,因为我不确定您需要其他属性的方式/原因):


显示冲压类定义我刚刚编辑过!请看一看…你的类实现在我看来不太好。如果
TimeOut
TimeIn
都是空的,
TimeIn
不空的是
TimeIn
如果两者都是,那么
TimeOut
对我的计算没有帮助,先生。。。我需要知道如何在几个小时内将这两个列表相互比较。在这两个列表中,您将如何关联timein和timout用户考虑一下我很抱歉,但结果不起作用。我需要更多关于如何使用这些变量的具体细节…嗯,flex值在视图中仍然显示为0。。。我不太清楚为什么计算不起作用!FlexTime=FlexTime.Sum(f=>f.TotalTime)-“无法将源类型'double'转换为目标类型'decimal'是的,它可以工作。但现在的问题是,无论用户在什么时间戳入或戳出,它都会加起来。加起来必须超过8小时,然后才应该使用差值。当然,如果当天少于8小时,则反之亦然。。。
var workDay = 8;
var flexModel = new FlexModel 
{
    FlexTime = Convert.ToDecimal(flexitime
                   .Sum(f => f.TotalTime - workDay))
};
return View(flexModel);