c# - 用户通过 linq 等选择的日期范围到几周

标签 c# linq asp.net-mvc-2 aggregate-functions

我有一个表单,用户可以选择开始和结束日期来获取数据。 尽管用户选择开始和结束日期,但我必须在日期范围内逐周显示表格中的数据。

我的模型很简单

public class DateBetween
      public Datetime StartDate{ get;set;}
      public Datetime EndDate{ get;set;}

我从数据库中获取这些日期之间的数据列表

IList<Revenue> datas = DB.CreateCrateria(typeof(Revenue))
              .Add(Restrictions.Bt("Date", model.startDate, model.endDate))
              .List<Revenue>();

public class Revenue
      public int Id{ get;set;}
      public double Revenue { get;set;}
      public Datetime RevenueDate{ get;set;}

例子:

id     Date         Revenue  
1      10/11/2011   554 
2      11/10/2011   500

等等

如果用户选择像 6/30/2011 和 10/15/2011 这样的日期

我想展示给用户

 Week         Date                     Avg.Revenue 
Week 1        6/30/2011-7/2/2011       587 
Week 2        7/3/2011-7/9/2011        650

...

etc

是否有任何关于聚合函数的建议。在 linq 中

最佳答案

您可以使用手写的 LINQ 或使用此答案:

LINQ query to split an ordered list into sublists of contiguous points by some criteria

示例:只使用普通的 Linq 和 DateTime/Calendar:

var rnd = new Random();
var data = Enumerable.Range(1,100).Select(i => DateTime.Now.AddDays(rnd.Next(-91000,91000)/24));

var calendar = CultureInfo.CurrentCulture.Calendar;
Func<DateTime, int> twoWeeks = dt => (dt.Year * 100) + 2 * (calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday) / 2);

var by2weeks = data.GroupBy(twoWeeks);

foreach (var period in by2weeks.OrderBy(g => g.Key))
{
    Console.WriteLine("{0}: {1}", period.Key, string.Join(", ", period));
}

对于 C# 3.5 及更早版本 string.Join(", ", period)

string.Join(", ", period.Select(o => o.ToString()).ToArray())

关于c# - 用户通过 linq 等选择的日期范围到几周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112800/

相关文章:

c# - 需要帮助完成或重写此算法以导航通用集合

c# - 如何在 Linq 上获得左连接

c# - 将值绑定(bind)到复杂类型

c# - 将摩尔斯电码解码为文本

c# - 快速而肮脏的 GridView 不起作用

c# - 测试 I/O 完成端口支持

c# - 方法覆盖和多态性

c# - 如何在 C# 中使用 LINQ 根据值 (DateTime) 删除一半的字典项?

c# - .Net session 范围变量?

Apache 在运行 mod_mono 时泄漏信号量