使用do while循环LINQ查询并显示结果

时间:2019-07-10 11:28:19

标签: c# asp.net-mvc linq

我正在努力让前几个月没有付款的人

public ActionResult Arrears()
{
    int month = DateTime.Now.Month;
    int year = DateTime.Now.Year;
    int i = 4;
    do
    {
        var subscriber = db.Subscriptions
            .Where(s => s.SubMonth == month && s.SubYear == year)
            .Select(s => s.UserName).Distinct().ToList();
        var alls = db.Members.Select(s => s.UserName).ToList();
        var notsubs = alls.Except(subscriber).ToList();
        List<Subscription> user = new List<Subscription>();
        List<Subscription> querie = new List<Subscription>();
        notsubs.ForEach(s => user.Add(new Subscription(s)));
        month = month - 1;
        i = i - 1;
        return View(user);
    } while (i != 0);
}

它给了我一个列表,该列表仅是当月尚未订阅,但我希望在过去四个月内订阅

1 个答案:

答案 0 :(得分:1)

  

它给了我一个列表,该列表仅是当月尚未订阅,但我希望在过去四个月内订阅

您的循环内有一个return语句。由于return语句周围没有条件,因此您将在第一次迭代期间退出循环。 快速解决方案是在循环上方声明 List用户变量,并在循环下方编写return语句。

也就是说,在过去四个月中至少有一个订阅了但没有另一个订阅的用户将出现在结果列表中。如果不希望这样做,您可能要考虑完全删除循环,并一次性获取最近4个月的所有订阅。

还请注意,由于订阅年份和年份变量不匹配,因此每年1月至3月之间都会出现错误。 为避免这种情况,建议不要在订阅中使用月份和日期作为两个单独的字段,而应使用单个类型为DateTime的字段。然后,您可以直接将此字段与DateTime.UtcNow.AddMonths(-4)比较。

修改

带有DateTime字段:

public ActionResult Arrears()
{
    DateTime minDate = DateTime.UtcNow.AddMonths(-4);
    var subscribers = db.Subscriptions
      .Where(s => s.SubscriptionDate >= minDate)
      .Select(s => s.UserName);
    return View(
        db.Members.Select(m => m.UserName)
        .Where(u => subscribers.All(s => s != u))
        .ToList());
}

带有“月和年”字段:

public ActionResult Arrears()
{
    DateTime iterationDate = DateTime.UtcNow;
    var subscribers = 
        db.Subscriptions.Where(
            s => s.SubMonth == iterationDate.Month 
                && s.SubYear == iterationDate.Year);

    for(int i=0; i<3; i++)
    {
        iterationDate = iterationDate.AddMonth(-1);
        subscribers = subscribers.Union(
            db.Subscriptions.Where(
            s => s.SubMonth == iterationDate.Month 
                && s.SubYear == iterationDate.Year)
        );
    }

    var subscriberNames = subscribers.Select(s => s.UserName).Distinct();

    return View(
        db.Members.Select(m => m.UserName)
        .Where(u => subscriberNames.All(s => s != u))
        .ToList());
}

请注意,使用第一个解决方案,您将查看最近四个月(2019-03-10),而使用第二个解决方案,您将查看自2019-03-01起的所有订阅。 注意2:这些解决方案将为您提供在过去4个月内完全没有订阅的所有成员。这是您需要的吗?