C# 使用dateTime从MVC模型中获取LINQ当月的行数,这可能吗?
我需要知道同一个表中有多少行在同一个月,我不知道该怎么做。我想我会尝试一些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
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。