簡體   English   中英

比較C#ASP.NET MVC LINQ實體框架中的兩個列表

[英]Comparing two lists in C# ASP.NET MVC LINQ Entity Framework

如標題所示,即時通訊試圖比較帶時間戳的日期時間和帶時間戳的日期時間。

我有一個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; }
}

視圖:

@Html.LabelFor(model => model.FlexTime, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
    @Html.DisplayFor(model => model.FlexTime, new { htmlAttributes = new { @class = "form-control" } })
    @Html.ValidationMessageFor(model => model.FlexTime, "", new { @class = "text-danger" })
</div>

控制器:

public ActionResult Info()
{
    var flexModel = new FlexModel();
    var userId = (int)Session["userId"];
    var user = _db.Users.Find(userId);
    var stampIn = _db.Stampings
                     .Where(i => i.StampingType == "in")
                     .Where(i => i.User == user)
                     .ToList();

    var stampOut = _db.Stampings
                      .Where(i => i.StampingType == "out")
                      .Where(i => i.User == user)
                      .ToList();

    var workDay = 8;

    if (stampIn.Count == 0)
    {
        return View();
    }

    foreach (var itemIn in stampIn)
    {
        //Dont know what to do here
    }

    foreach (var itemOut in stampOut)
    {
        //Dont know what to do here either
    }

    return View();
}

請幫忙。

您可以像這樣關聯列表:

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屬性,因為不確定如何/為什么需要其他屬性):

var workDay = 8;
var flexModel = new FlexModel 
{
    FlexTime = Convert.ToDecimal(flexitime
                   .Sum(f => f.TotalTime - workDay))
};
return View(flexModel);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM