C# 使用dateTime从MVC模型中获取LINQ当月的行数,这可能吗?

C# 使用dateTime从MVC模型中获取LINQ当月的行数,这可能吗?,c#,sql,linq,asp.net-mvc-4,C#,Sql,Linq,Asp.net Mvc 4,我需要知道同一个表中有多少行在同一个月,我不知道该怎么做。我想我会尝试一些LINQ,但我以前从未使用过,所以我甚至不知道这是否可行。请帮帮我 public ActionResult returTest() { ViewData["RowsWithSameMonth"] = // I'm guessing I can put some LINQ here? var returer = from s in db2.Re

我需要知道同一个表中有多少行在同一个月,我不知道该怎么做。我想我会尝试一些LINQ,但我以前从未使用过,所以我甚至不知道这是否可行。请帮帮我

        public ActionResult returTest()
        {
            ViewData["RowsWithSameMonth"] = // I'm guessing I can put some LINQ here?

            var returer = from s in db2.ReturerDB select s;
            return View(returer.ToList());
        }
理想情况是得到一个二维数组,第一个单元格中有月份,第二个单元格中有db的行数

我希望结果是:

    string[,] statistics = new string[,]
{
    {"2013-11", "5"},
    {"2013-12", "10"},
    {"2014-01", "3"}
};
这可行吗?或者我应该只是查询数据库,做很多事情吗?我想我可以自己解决这个问题,但这意味着会有很多难看的代码。背景:IT公司自学成才的C#开发人员,有1年丑陋的代码技巧经验,没有任何正式学位

编辑

var returer = from s in db2.ReturerDB select s;

            var dateRange = returer.ToList();

            var groupedData = dateRange.GroupBy(dateRow => dateRow.ToString())
            .OrderBy(monthGroup => monthGroup.Key)
            .Select(monthGroup => new
            {
                Month = monthGroup.Key,
                MountCount = monthGroup.Count()
            });

            string test01 = "";
            string test02 = "";

            foreach (var item in groupedData)
            {
                test01 = item.Month.ToString();
                test02 = item.MountCount.ToString();
            }
在调试中,test01是“Namespace.Models.ReturerDB”,test02是预期的“6”,或者至少是预期的。我做错了什么

您需要的是分组。 考虑到您有一个日期列表,解决方案如下:

var dateRows = // Get from database

var monthlyRows = from dateRow in dateRows
                  group dateRow by dateRow.ToString("yyyy/mm") into monthGroup
                  orderby monthGroup.Key
                  select new { Month=monthGroup.Key, MountCount=monthGroup.Count };

// Your results would be a list of objects which have `Month` and `MonthCount` properties.
// {Month="2014/01", MonthCount=24}
// {Month="2014/02", MonthCount=28}
通过向mehrandvd点头,以下是您将如何使用linq方法链方法实现这一点:

var dateRange = { // your base collection with the dates};

// make sure you change MyDateField to match your won datetime field
var groupedData = dateRange
        .GroupBy(dateRow => dateRow.MyDateField.ToString("yyyy-mm"))
        .OrderBy(monthGroup => monthGroup.Key)
        .Select(monthGroup => new
        {
            Month = monthGroup.Key, 
            MountCount = monthGroup.Count()
        });
根据OP,这将为您提供所需的结果

[编辑]-根据要求,访问新创建的匿名类型的示例:

foreach (var item in groupedData)
{
    Console.WriteLine(item.Month);
    Console.WriteLine(item.MountCount);
}
,您可以将整个堆作为jsonresult返回到客户端应用程序,并在其中进行迭代,即视图的最后一行是:

return Json(groupedData, JsonRequestBehavior.AllowGet);
希望这能澄清问题。

您可以这样做:

var groupedData = db2.ReturerDB.GroupBy(r => new { r.Date.Year, r.Date.Month })
             .Select(g => new { g.Key.Year, g.Key.Month, Count = g.Count() })
             .OrderBy(x => x.Year).ThenBy(x => x.Month);
             .ToList();
var result = groupedData
             .ToDictionary(g => string.Format("{0}-{1:00}", g.Year, g.Month),
                           g => g.Count);
这会给你

键值
---------------
2013-11    5
2013-12   10
2014-01    3
(创建字典比创建二维数组稍微容易一些)


这将针对linq to SQL的类似SQL后端的实体框架,因为表达式
r.Date.Year
r.Date.Month
可以转换为SQL。

dateRows,这需要什么?我尝试了var dateRows=returer.ToList();按照我上面的代码,但那不起作用。它需要什么?我假设
dateRows
类型是
列表
。啊,我的错,我现在就试试+1-这也是我的方法,虽然我是方法链接的吸盘,而不是查询语法,但最终结果相同。为了完整起见,我在下面添加了我的版本。请始终标记您使用的LINQ香精。我想,实体框架?christopher-您需要做一些事情才能使新添加的内容生效:首先,您需要显式地告诉
GroupBy()
方法您分组的确切字段。这可能类似于
dateRange.GroupBy(dateRow=>dateRow.MyDateColumn.ToString(“yyyy-mm”)
。正如您所见,您还需要通过
'yyyy-mm'
的格式字符串来限制组。希望这有帮助。我会将其添加到我的答案中,以防其他人碰巧找到它并需要完整的答案。您的编辑不清楚什么是
dateRow
,但我认为下面的答案也应该这样做。+1用于区分关于sql后端透明度!!此解决方案可编译且不提供任何错误,但如何访问“groupedData”中的值?我仍然有问题,我将用更多代码编辑OP。