【问题标题】:Force Calculate A Duration To Year强制计算 A Duration To Year
【发布时间】:2019-11-24 09:43:09
【问题描述】:

我有一个要求,我必须强制将持续时间显示为两年完成。例如,从 2016 年到 2018 年在应用程序中在线活跃的任何客户都应被视为在应用程序中完成两年。这看起来很简单,并使用以下Linq 使其工作:

var result = (from c in db.Users
              where c.UserId == id && (c.Start.Year >= 2016 && c.End.Year <= 2018)
              select c).ToList ();

 int years = 0;
 if (result.Count () > 0)
 {
     years = 2;
 }
 else
 {
    //Logic goes here
 }

因此可以看出我是在强制它计算两年的持续时间。根据这一点,我将授予用户系统中 20% 的忠诚度。虽然我构建逻辑有点复杂。同样,在该范围内,用户可能在 2016 年至 2017 年期间处于活跃状态。因此这些用户将没有资格获得忠诚度。

对于不符合条件的用户,我怎样才能使上述两个条件的工作两年?任何想法将不胜感激。

【问题讨论】:

  • 是否可以有 2015 年的开始年份和 2019 年的结束年份?他们是否也获得了您的忠诚度百分比?
  • Linq 似乎很有前途@Tim Schmelter。我会尝试并告诉你。
  • 是的@Tyddlywink。这是 2015 年至 2017 年之间的条件 - 两年。
  • 那么你想要这个(c.Start.Year &lt;= 2016 &amp;&amp; c.End.Year &gt;= 2018),但这只会返回起始年份为 2016 年或更短,结束年份为 2018 年或更高的用户。你永远不会得到一个不到 2 年的用户。看起来这不是你所追求的。
  • 是的,我可以找回它。但我想要第二个以及不到两年的用户@Tyddlywink。

标签: c# asp.net .net linq


【解决方案1】:

我想这就是你所追求的。它获取用户并确定开始年份和结束年份之间的时间跨度,将该值分配给年份,然后检查它是否小于 2。如果是,请执行您的逻辑。我假设 UserId 是唯一的,并且总会有至少一个条目。

这是一个有效的小提琴:https://dotnetfiddle.net/bVDpkF

var result = (
    from c in db.Users
    where c.UserId == id
    select c).Single();



int years =  result.End.Year - result.Start.Year;

if (years <= 2)
{
//Logic goes here
}

【讨论】:

  • 好一个@Tyddlywink。我也会尝试,并且正在考虑这个。
  • 添加了一个 Fiddle 来展示它的工作原理。我猜到了你的用户类结构。在我上面的例子中,我哎呀,翻转了数学。 End 应该减去 Start。
  • 非常感谢@Tyddlywink,工作完美。虽然我很好奇一件事,如果你能提供一个解决方案。假设我现在正在计算年份(2016 到 2018 - 两年)。现在,如果我想用年份来强制月份,比如(2006 年 1 月到 2008 年 12 月 - 两年),逻辑将如何实现?
  • 而2006年7月到2008年4月不是2年吗?
  • 我将假设我之前的问题是肯定的。这将为您完成。 dotnetfiddle.net/bVDpkF
【解决方案2】:

您也许可以计算 Linq 查询中的时间跨度。

var list = cItems.Where(x => ((TimeSpan)(x.End - x.Start)).Days > 730).ToList();

【讨论】:

  • 我猜这适用于一种情况。我需要检查用户是否活跃超过或等于两年以及少于两年。我评论了@Tyddlywink 的答案,如果你能为此提供解决方案会更好。非常感谢。
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多