计算订阅在月内结束的用户Linq c#

时间:2017-06-13 07:29:46

标签: c# .net linq

我只想计算订阅结束日期在下个月内的用户:

int Count = oUsers
            .Where(x =>
            0 < x.SubscriptionEnddate.Value.Subtract(DateTime.Now).Days < 30)
            .Count();

但它不起作用。

我想要做的是 0&lt;价值&lt; 30

7 个答案:

答案 0 :(得分:4)

使用&&。期。这是它的设计目标。

您可以通过创建Between扩展方法或连接两个Where子句来规避这一点,但实际上,为什么要在&&之间进行交易。但如果你坚持:

int c = oUsers
        .Select(x=> x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days)
        .Where(d => 0 < d)
        .Where(d => d < 30)
        .Count();

答案 1 :(得分:0)

你可以尝试这样的事情

int count = oUsers.Where(x=> x.Days > 0).Count(x => x.Days < 30);

答案 2 :(得分:0)

我会这样做以保持可读性:

int Count =
    oUsers
        .Select(u => new
        {
            u,
            days = u.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days,
        })
        .Where(x => x.days > 0 && x.days < 30)
        .Select(x => x.u)
        .Count();

这显然使用&&,但它消除了代码重复,我认为这是你真正想要避免的。

最后使用.Count()无需跟踪原始值,因此,正如Patrick已经发布的那样,这就足够了:

int Count =
    oUsers
        .Select(u => u.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days)
        .Where(x => x > 0 && x < 30)
        .Count();

答案 3 :(得分:0)

并不总是越短越好。

当其他人阅读您的代码时,当您调用SomeRange方法时,他将更容易理解

我认为最好的原因是当代码更具可读性时,如果您的值与开始和结束范围匹配并调用它,您可以执行返回方法。

某些int范围的示例,但同样可以检查日期的原因

    public static bool SomeRange(int value,int start,int end)
    {
        return (value > start && value < end);
    }
    static void Main()
    {
        List<int> valueList = new List<int> { 1,65,3,76,34,23,11,5,665,334};
        var result = valueList.Where(x => SomeRange(x, 0, 30)).Count();
    }

答案 4 :(得分:0)

是使用Enumerable.Range解决它:

oUsers.Where(x => x.SubscriptionEnddate != null && Enumerable.Range(0, 30).Contains(x.SubscriptionEnddate.Value.Subtract(DateTime.Now).Days)).Count();

答案 5 :(得分:0)

我会说,在执行计数之前预先计算范围的开始和结束,然后比较start && end

// some test data
var oUsers = Enumerable.Range(0, 100).Select(x => new { SubscriptionEnddate = (DateTime?)DateTime.Now.AddDays(x) });

var rangeStart = DateTime.Now;
var rangeEnd = rangeStart.AddDays(30);
// Conditional count... can also be done as .Where(condition).Count()
int Count = oUsers.Count(x => x.SubscriptionEnddate >= rangeStart && x.SubscriptionEnddate < rangeEnd);

可能会使用DateTime.Today,因为您只对几天感兴趣。

答案 6 :(得分:-1)

如果你真的反对使用&&

,你可以使用嵌套的if语句
if x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days > 0 {
  if x.SubscriptionEnddate.Value.Subtract(DateTime.Now.AddDays(30)).Days < 30 {
    int count = oUsers;
  }

}

这似乎是一种令人难以置信的迟钝的方式。这就是我们拥有&&运算符的原因。