如果为空,C#LINQ查询使用以前的结果

时间:2013-10-28 16:12:51

标签: c# linq datatable

我有一个从Access DB填充的数据表。结果看起来像

Month | Sum
--------------
1 | 1464
2 | 1716
3 | 2125
4 | 2271
5 | 2451
6 | 2583
7 | 2671
9 | 2823
10 | 2975

你说得对 - 没什么可说的! 我想要的是,8月使用与7月相同的值。 目前我正在使用此LINQ查询将数据添加到折线图:

for (int i = 1; i <= System.DateTime.Now.Month; i++)
            {
                var numbers = (from p in dTable.AsEnumerable()
                              where p.Field<int>("M") >= i
                              select p).First();                   
                series2.Points.Add(new DataPoint { AxisLabel = i.ToString(), YValues = new double[] { Convert.ToDouble(numbers["Sum"]) } });  
            }

显示图表,但是8月使用了9月的值。我认为这是一个非常基本的东西,我做错了,但我根本无法搞清楚。 提前谢谢!

2 个答案:

答案 0 :(得分:4)

您要求的所有月份都超过当月。

where p.Field<int>("M") >= i

因此,对于八月(8),你正在检索9月及更高(9,10,11,12),而不是7月(7)。

您必须反转您的约束,并按降序排序:

var numbers = (from p in dTable.AsEnumerable()
                          where p.Field<int>("M") <= i
                          select p)
                         .OrderByDesc(p => p.Month) 
                         .First();   

答案 1 :(得分:2)

你必须颠倒你的逻辑:

var numbers = (from p in dTable.AsEnumerable()
               where p.Field<int>("M") <= i
               select p).Last();

不言而喻,如果没有上个月,这不起作用。

更新:

以上假设您正在阅读的表格已经订购。如果不是这样,你必须自己订购(如Cyril Gandon所述):

var numbers = (from p in dTable.AsEnumerable()
               where p.Field<int>("M") <= i
               orderby p.Field<int>("M") descending
               select p).First();