2014-10-03 2 views
1

Как говорится в названии, im пытается сравнить штамп в datetime и вычеркнутый datetime.Сравнение двух списков в C# ASP.NET MVC LINQ Entity Framework

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

"Если я штамповать в 08:00 и искоренять 17:00, мой прогибается должен быть +1 (ч)"

Модель:

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

Я только что отредактировал его! Посмотрите, пожалуйста, ... – Qvadriologic

+0

ваша реализация класса не выглядит прекрасной для меня, добавьте в класс 'TimeOut' и' TimeIn' оба, если 'TimeOut' равно null, а' TimeIn' не null - это 'TimeIn', если nboth тогда это' TimeOut' –

ответ

1

Вы можете сопоставить списки, как это:

var attendance = from sin in stampIn 
       select new 
       { 
        StampIn = sin, 
        StampOut = stampOut.FirstOrDefault(sout => 
            sout.Timestamp > sin.Timestamp) 
       }; 

Это дает вам список Stampin против stampout событий (хотя искоренять может быть пустым). Затем нужно рассчитать скользящему графику, как это:

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

Мне жаль, но результат не работает. Мне нужна более подробная информация о том, как использовать эти переменные, пожалуйста ... – Qvadriologic

+0

Как он не работает? – DavidG

+0

Ну, значение flex все еще показывает 0 в представлении ... Я не совсем уверен, почему вычисление не работает! – Qvadriologic

Смежные вопросы