Цикл запроса LINQ с использованием do while и отображения результата - PullRequest
1 голос
/ 10 июля 2019

Я работаю над привлечением лиц, которые не платили за предыдущие месяцы

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 месяцев

1 Ответ

1 голос
/ 10 июля 2019

Это дает мне список участников, которые не подписались только в текущем месяце, и все же я хочу за последние 4 месяца

В вашем цикле есть оператор возврата.Поскольку в операторе return нет условий, вы выйдете из цикла во время первой итерации.Быстрое решение состоит в том, чтобы объявить переменную List user над циклом и написать оператор возврата под циклом.

При этом пользователи, которые подписались хотя бы на один из последних4 месяца, но не еще один появится в списке результатов.Если это не предназначено, вы можете рассмотреть возможность полного удаления цикла и получения всех ваших подписок за последние 4 месяца за один раз.

Также обратите внимание, что у вас будет ошибка в период с января по март каждого года, поскольку год подписки и переменная года не будут совпадать.Чтобы избежать этого, я бы предложил не использовать месяц и дату как два отдельных поля, а иметь одно поле типа 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());
}

Обратите внимание, что с первым решением вы просматриваете последние 4 месяца (2019-03-10), а со вторым решением вы просматриваете все подписки, начиная с 2019-03-01.Примечание 2: эти решения предоставят вам всех участников, у которых вообще не было подписок за последние 4 месяца.Вам это нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...