我一直试图找出最佳的方式模型,这个实体,并且我得到坚持。这里的基本使用情况/故事:

我们有设备抵达现场。我们不会知道什么样的设备直至其到达。一旦设备到达现场就必须被记录为具有抵达,以及它是否是闲置的或活动。如果是积极的用户必须注意的工作的设备进行的。当时的设备离开现场,为此必须加以注意。

我应该可以很容易地查询是否有任何设备的网站上,什么样的设备以前在网站等。

我被困在日期方面。我试图避免依赖于一时的工作运行的通过以及标记设备闲置,如果它还没有被标示闲置上取得联系获取具体日期。它觉得应该有一种方法来做到这一点。这里就是我来的:

public class Equipment {
    public int Id { get; set; }
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime Departure { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

想法是,我可以运行查询喜欢 Site.Equipment.Where(x=>x.Departure == null) 看看哪些设备,还是在网站上。如果没有EquipmentUtilization对于特定日期,这是假设不被闲置。然后我可以安装一个DateTimeEnumerator:

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {            
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

建立一个列表的日期从抵达日期,直至日期时间。现在或DepatureDate如果不是空。由于某些原因,这似乎是丑陋的.我应该把DateTime枚举的内部通过装备的对象?它感觉像这样的都应该在一起,或在一些不同的方式,虽然这不会工作如果我运行。建议?

有帮助吗?

解决方案

如果我理解正确的话,你寻求一种方式来确定哪些设备被闲置在一个特定地点在某个给定日期的基础上捕获的equipmentutilization对象相关的设备(也许EquipmentResidency是一个更好的名字吗?) 收集。

你想要的,以避免创建equipmentutilization对象的空闲天(我同意,可能是重大的维修),如何关于增加一个isIdleOn(日期)的方法的equipmentutilization类返回真正的如果传递的日期相匹配的捕获ReportDate和虚假的,如果它不?

相关的查询将沿线的东西的网站。设备。在哪里(x=>x。equipmentutilization.isIdleOn(日期)==true)

不知道,如果我们的语法正确的,但只是一个建议。

其他提示

我看到的一个潜在问题是一台设备只知道其当前站点。如果你想知道,如果Loader123 2个月前在SiteXYZ,你不能检索信息,使用当前的模型。

它看起来像你使用的粒度是某一天。这绝对会让事情变得更简单,因为你并不需要弄清楚如何跟踪它,如果一台设备是从11 pm-4am用在SiteABC,然后1个pm-5pm上SiteXYZ。

考虑到这些事情,我会做你的模型中的一些略微的变化。我会保持所有站点的设备已经在(Equipment.History)的集合,并提供方便的功能,发现它是目前在该网站(取SiteHistory.Departure没有一个值)。对于自己利用率,我会提供一个方便的功能,它们返回的字典,通过键入日期时间。然后,您可以做该字典的主要收集操作,很容易算多少天一件装备在给定时间内被实际利用。

public class Equipment 
{
    public int Id { get; set; }
    public IList<SiteHistory> History { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
    public IDictionary<DateTime, EquipmentUtilization> UtilizationsDictionary { get{...} }
    public Site CurrentSite { get{...} }
}

public class SiteHistory {
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime? Departure { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }  // is this a circular-reference back to the parent?  Might be able to omit it.
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

对于任何快速正肮脏的设计,我敢肯定,这其中有一些漏洞,并且可以使用一些改进。但希望它可以让你一点点接近你在找什么。

我不会有一个DateTime枚举亲自;像你说的,这听起来是错误的。

我必须承认,我挣扎在这里跟着你时,你说什么应该被归类为闲置。不管你用它来确定,如果事情是闲置你可以放在一个属性,e.g:

public class Equipment
{ 
    public int Id { get; set; } 
    public Site Site { get; set; } 
    public DateTime Arrival { get; set; } 
    public DateTime Departure { get; set; } 
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }

    public bool IsIdle
    {
        get
        {
            // This checks if the EquipmentUtilizations is empty
            // or if the Equipment is older than three days
            return (this.EquipmentUtilizations == null) ||
                   ((this.Departure == null) &&
                    (this.Arrival < DateTime.Today.AddDays(-3))
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top