2011-05-10 59 views
0

我已经完全停止了我的程序和即时消息,需要一些帮助。c#排序列表<DateTime>并插入到数据库中

我得到一个xml文件,包含客户账单和结算日期。这个文件有大约4000个结算日期。我想要的是对它们进行排序,以便在周期日期范围2010-04-01 - 2011-03-31中添加一个名为period1的表格列。其他日期进入第二阶段,即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 

+0

你是什么意思“添加到名为period1的表列”?增加列? – 2011-05-10 10:28:37

回答

3

Enumerable.All扩展方法返回真如果每个元素在序列中验证条件。如果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

你在做什么,如下:
检查所有日期是否是期之一。如果是这样,请将它们插入数据库的第1期。如果不是,请检查是否所有日期都处于第二阶段,并将它们插入数据库的第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)); 
} 

BTW:我在你的第二个条件固定的错误。它应该是date <= stopDatePeriod2而不是date >= stopDatePeriod2

1

全部返回一个布尔值,指定是否所有元素满足条件。你需要的是一个Where()来提取你需要的。

喜欢的东西:

adapterBonus.InsertPeriod1Query(dates.Where(date => date >= startDatePeriod1 && date <= stopDatePeriod1)); 
adapterBonus.InsertPeriod2Query(dates.Where(date => date >= startDatePeriod2 && date <= stopDatePeriod2)); 
1

试试这个:

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

最简单的方法是做一个

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

好像你刚需要为每个奖励期一个简单的查询,像...

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

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

正如丹尼尔说,你要检查,如果所有的日期是各个时期,这听起来像是永远不会是真正的内部,所以什么都不会正在发生。