Сравнение двух списков в C # ASP.NET MVC LINQ Entity Framework

1

Как гласит название, я пытаюсь сравнить штамп в datetime и вычеркнул дату и время.

У меня есть гибкая переменная, которая должна получить значение разницы между этими двумя датами в рабочий день (8 часов).

"Если я напечатаю в 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();
}

Пожалуйста помоги.

  • 1
    показать определение класса штамповки
  • 0
    Я только что отредактировал это! Посмотрите, пожалуйста...
Показать ещё 4 комментария
Теги:
linq
asp.net-mvc

1 ответ

1
Лучший ответ

Вы можете сопоставить списки следующим образом:

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 свойство FlexTime как я не уверен, как/почему вам нужны другие):

var workDay = 8;
var flexModel = new FlexModel 
{
    FlexTime = Convert.ToDecimal(flexitime
                   .Sum(f => f.TotalTime - workDay))
};
return View(flexModel);
  • 0
    Извините, но результат не работает. Мне нужно более подробно описать, как использовать эти переменные, пожалуйста ...
  • 0
    Как это не работает?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню