2012-06-26 61 views
0

我需要建立一个LINQ查询,将显示结果如下:LINQ查询 - 获得当月加上前几个月

Data: 

Sales Month 
---------------------- 
10  January 
20  February 
30  March 
40  April 
50  May 
60  June 
70  July 
80  August 
90  September 
100  October 
110  November 
120  December 

我需要基于这种方案的结果: 月x =月x +比上月 ,这将导致:

Sales Month 
-------------------- 
10  January 
30  February (30 = February 20 + January 10) 
60  March (60 = March 30 + February 30) 
100  April (100 = April 40 + March 60) 
......... 

任何帮助如何构建这个查询?

非常感谢!

+0

你是在谈论linq2sql或linq查询对象? –

+0

Hi Shoaib:在对象上的linq查询 –

+0

广义地说,用'['序列'.skip(1)'']''Zip'序列。在不知道实际使用的类型的情况下,我们无法提供更多细节,更不用说代码了。 – AakashM

回答

0

既然你在LINQ想要它......

void Main() 
{ 
    List<SaleCount> sales = new List<SaleCount>() { 
     new SaleCount() { Sales = 10, Month = 1 }, 
     new SaleCount() { Sales = 20, Month = 2 }, 
     new SaleCount() { Sales = 30, Month = 3 }, 
     new SaleCount() { Sales = 40, Month = 4 }, 
     ... 
    }; 

    var query = sales.Select ((s, i) => new 
    { 
     CurrentMonth = s.Month, 
     CurrentAndPreviousSales = s.Sales + sales.Take(i).Sum(sa => sa.Sales) 
    }); 
} 

public class SaleCount 
{ 
    public int Sales { get; set; } 
    public int Month { get; set; } 
} 

......但在我看来,这是一个情况下想出一些花哨LINQ不会像只是写清晰取出LINQ查询将要生成的代码。这也不能缩放。例如,如果仅仅写出“老式的方式”,那么包含多年的数据会变得更加多毛。

0

如果您不希望每个月累计以前的所有销售额,则必须以某种方式跟踪总销售额。聚合函数可以正常工作,因为我们可以建立一个列表并将其最后一个元素用作计算下一个元素的当前总数。

var sales = Enumerable.Range(1,12).Select(x => x * 10).ToList(); 
var sums = sales.Aggregate(new List<int>(), (list, sale) => list.Concat(new List<int>{list.LastOrDefault() + sale});