c # сортировка списка <DateTime>и вставка в базу данных - PullRequest
0 голосов
/ 10 мая 2011

Я полностью остановился с моей программой, и мне нужна помощь.

Я получил XML-файл с счетами клиентов и датами выставления счетов.Этот файл имеет около 4000 дат выставления счетов.Я хочу отсортировать их так, чтобы один раз, находящийся в диапазоне даты периода 2010-04-01 - 2011-03-31, добавлялся в столбец таблицы с именем period1.А другие даты относятся к period2, то есть 2011-04-01 - 2012-03-31.

Я тестировал и тестировал это решение различными способами, но оно не будет работать.Я добавляю все данные в список с именем даты.И пытается:

if (dates.All(date => date >= startDatePeriod1 && date <= stopDatePeriod1))
{
    adapterBonus.InsertPeriod1Query(// insert to database));
}
else if (dates.All(date => date >= startDatePeriod2 && date >= stopDatePeriod2))
{
    adapterBonus.InsertPeriod2Query(// insert to database));
}

startDatePeriod1 = 2010-04-01
stopDatePeriiod1 = 2011-03-31  

и так далее

Ответы [ 6 ]

3 голосов
/ 10 мая 2011

Метод расширения Enumerable.All возвращает true, если каждый элемент в последовательности проверяет условие.Если dates содержит даты в обоих периодах, ни один из if не будет выполняться, потому что оба вызова Enumerable.All вернут false.

Я не уверен, что вы подразумеваете под "добавляет" в столбец таблицы с именемperiod1 ", но если вы хотите подсчитать все даты в каждом периоде, используйте Enumerable.Count:

int period1Count = dates.Count(date => date >= startDatePeriod1 && date <= stopDatePeriod1);
int period2Count = dates.Count(date => date >= startDatePeriod2 && date <= stopDatePeriod2);
adapterBonus.InsertPeriod1Query(period1Count);
adapterBonus.InsertPeriod2Query(period2Count);
2 голосов
/ 10 мая 2011

Что вы делаете, это следующее:
Проверьте, находятся ли даты ALL в первом периоде.Если это так, вставьте их в период 1 в базе данных.Если нет, проверьте, относятся ли даты ALL ко второму периоду, и вставьте их в период 2 в базе данных.

Вы хотите сделать следующее:

foreach (var period1Date in dates.Where(date => date >= startDatePeriod1 && 
                                                date <= stopDatePeriod1))
{
    adapterBonus.InsertPeriod1Query(// insert period1Date to database));
}
foreach (var period2Date in dates.Where(date => date >= startDatePeriod2 && 
                                                date <= stopDatePeriod2))
{
    adapterBonus.InsertPeriod2Query(// insert period2Date to database));
}

Кстати: я исправил ошибку в вашем втором состоянии.Это должно быть date <= stopDatePeriod2 вместо date >= stopDatePeriod2!

1 голос
/ 10 мая 2011

кажется, что вам нужен простой запрос для каждого бонусного периода, что-то вроде ...

var period1Dates = date.Where(date => date >= startDate1 && date <= stopDate1);
var period2Dates = date.Where(date => date >= startDate2 && date <= stopDate2);

adapterBonus.InsertPeriod1(period1Dates);
adapterBonus.InsertPeriod2(period2Dates);

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

1 голос
/ 10 мая 2011

Самый простой способ сделать это -

startDatePeriod1 = 2010-04-01;
stopDatePeriod1 = 2011-03-01;   
startDatePeriod2 = 2011-04-01;
stopDatePeriod2 = 2012-03-01;

foreach(DateTime d in dates) {
    if (d => startDatePeriod1 && d <= startDatePeriod1) {
        adapterBonus.InsertPeriod1Query(// insert to database));
    } else if(d => startDatePeriod2 && d <= stopDatePeriod2) {
        adapterBonus.InsertPeriod2Query(// insert to database));

    }
}
1 голос
/ 10 мая 2011

Попробуйте:

var period1Dates = dates.Where(date => date >= startDatePeriod1 && date <= stopDatePeriod1);
var period2Dates = dates.Where(date => date >= startDatePeriod2 && date >= stopDatePeriod2);

foreach(var date in period1Dates)
{                          adapterBonus.InsertPeriod1Query(// insert to database)); }

и т. Д.

1 голос
/ 10 мая 2011

Все возвращают логическое значение, указывающее, удовлетворяют ли все элементы условию. Что вам нужно, это где (), чтобы извлечь те, которые вам нужны.

Что-то вроде:

adapterBonus.InsertPeriod1Query(dates.Where(date => date >= startDatePeriod1 && date <= stopDatePeriod1));
adapterBonus.InsertPeriod2Query(dates.Where(date => date >= startDatePeriod2 && date <= stopDatePeriod2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...