Это дает мне список участников, которые не подписались только в текущем месяце, и все же я хочу за последние 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 месяца.Вам это нужно?