从星期日到星期六返回每周当天的行数实体框架C#

时间:2017-12-18 17:32:45

标签: c# entity-framework

我试图每周返回一天的记录数。我的代码只返回有记录的那天的记录,如果那天没有插入记录,我想返回0。以下是我的代码。

//所需结果太阳到周六= [0,3,5,1,0,18,0],目前我只得到[3,5,1,18] // DateTime.Now.FirstDayOfWeek()是返回一周中第一天的扩展方法。谢谢你的帮助。

 var records = logs.Where(x=>x.date> DateTime.Now.FirstDayOfWeek())
            .GroupBy(x => x.date.Day)
            .Select(x =>
                x.Any()?x.Count():0 
           ).ToArray();

3 个答案:

答案 0 :(得分:1)

我不确定这个解决方案是否有效,但只是尝试一下,只需要用静态列表做左外连接,下面只是片段(伪代码)怎么做。

List<String> weekdays = new List<String>();
weekdays.Add("Monday");
weekdays.Add("Tuesday");
...
...
...
//Left outer join to display forcibly all weekdays and join them with your log's data and continue to grouping. 


var result = from w in weekdays
join l in logs into joined 
from j in joined.DefaultIfEmpty()

如果它不起作用,请发表评论,因为我有另一个解决方案让你可以使用:)

如果不起作用,请检查,在返回结果后,将结果(记录)加入您的静态数据(工作日),这意味着您已经仅返回其计数具有数据(> 0)的记录,但仅对于那些根本没有数据的记录,它应该在连接后变为零。

var result = from w in weekdays
join l in records into joined 
from j in joined.DefaultIfEmpty()

答案 1 :(得分:1)

您无法加入<html> <body> <div style="float:left"><h1 class="vertical-text-right spaced-text"> <a href="#">Right Text</a></h1></div> <div style="float:left"><h1 class="vertical-text-left spaced-text"> <a href="#">Left Text</a></h1></div> <center><div class="text-center"><h1 class="spaced-text text-center"> <a href="#"> Top Text</a></h1></div> </center> <div style="width:100%; height: 100px;"> <center><i>Some other content</i></center></div> <center><div class="text-center"><h1 class="spaced-text text-center"> <a href="#">Bottom Text</a></h1></div> </center> </body> </html>List,因为Linq to Entities无法将DbSet翻译为SQL语言。所以,似乎除了在循环中填补空白日期之外没有其他选择;

List

答案 2 :(得分:1)

使用其他扩展方法创建一系列日期:

public static IEnumerable<DateTime> Range(this DateTime startDate, int numberOfDays) => Enumerable.Range(0, numberOfDays).Select(e => startDate.AddDays(e));

您可以GroupJoin使用一周的日期并创建数组:

var recordgroups = logs.Where(x => x.date > DateTime.Now.FirstDayOfWeek())
           .GroupBy(x => x.date.Day);
var records = DateTime.Now.FirstDayOfWeek().Range(7)
                  .GroupJoin(recordgroups, wd => wd.Day, lg => lg.Key, (_, lg) => lg.Any() ? lg.First().Count() : 0).ToArray();