【问题标题】:Looping LINQ query using do while and display the result使用 do while 循环 LINQ 查询并显示结果
【发布时间】:2019-07-10 11:28:19
【问题描述】:

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

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);
}

它给了我一个仅在当月没有订阅但我想要过去 4 个月的会员列表

【问题讨论】:

  • 不要循环查找。相反,您应该进行一次查找,返回您感兴趣的 4 个月期间的所有非订阅者。此外,如果您将订阅月份和年份放入日期列中,您会发现更容易查询(如果您有一天它也会去那里,或者你可以只使用1)。然后,您可以进行日期范围查询,而不必对不同年份进行月份范围查询。 SubscriptionDate Between '2018-11-01' and '2019-02-28' 而不是 (SubYear = 2018 AND SubMonth Between 11 AND 12) OR (SubYear = 2019 AND SubMonth Between 1 AND 2)
  • 请花时间正确格式化您的代码。

标签: c# asp.net-mvc linq


【解决方案1】:

它给了我一个仅在当月没有订阅但我想要过去 4 个月的会员列表

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

话虽如此,在过去 4 个月中至少有一个月订阅但没有其他订阅的用户将出现在结果列表中。如果这不是故意的,您可能需要考虑完全删除循环并一次性获取过去 4 个月的所有订阅。

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

编辑

带有日期时间字段:

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());
}

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

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多