2
我有一个名为CreatedOn(可空的日期时间)列的帐户。LINQ to SQL:为提供的范围中的每个日期选择计数行?
我正在写一个方法,该方法需要两个参数来自(DateTime对象),我想选择from和to之间的所有日期以及在每个日期创建的T中的行数。
我该如何在LINQ中以优雅有效的方式做到这一点?
我试图做这种方式,但它似乎一旦在数据库中查询列表中的日期每个日期:
我有一个名为CreatedOn(可空的日期时间)列的帐户。LINQ to SQL:为提供的范围中的每个日期选择计数行?
我正在写一个方法,该方法需要两个参数来自(DateTime对象),我想选择from和to之间的所有日期以及在每个日期创建的T中的行数。
我该如何在LINQ中以优雅有效的方式做到这一点?
我试图做这种方式,但它似乎一旦在数据库中查询列表中的日期每个日期:
响应更新评论
我不会说它的优雅,但它只查询数据库一次。
static void Test(DataClasses1DataContext context, DateTime fromDate, DateTime toDate)
{
var result = context.Accounts
.Where(p => p.CreatedOn >= fromDate && p.CreatedOn <= toDate)
.GroupBy(x => x.CreatedOn.Date)
.Select(x => new {
dt = x.Key,
count = x.Count()});
}
List<DateTime> dates = new List<DateTime>();
while (fromDate <= toDate)
{
dates.Add(fromDate.Date);
fromDate = fromDate.AddDays(1);
}
var allDates = dates.Select(x => new {
dt = x,
count = 0});
// Merge both lists and then filter to include highest count
var result = rows.Concat(allDates)
.GroupBy(x => x.dt)
.Select(x => new {
dt = x.Key,
count = x.OrderByDescending(c => c.count)
.FirstOrDefault().count});
如果你只想要有行的日期,但是我也想要那些有零行的日期,那么你的方法是有效的。当然,我可以创建一个包含所有日期的新列表,并使用结果中的值(如果有),否则返回零。有没有更好的方法来做到这一点? – Nocklas
目前尚不清楚你的最后部分意思 - 如果你想按其他方面,你怎么会想到,当你只是“一天的比赛”获取工作? –
假设T还有另一个名为CreatedByAdmin的列。我希望查询很容易扩展,这样我可以按日期和CreatedByAdmin分组,并为每个这样的组合选择行数。 – Nocklas
真的不太清楚你想要什么样的查询结果的形式,说实话 - 特别是不能用已经按日期分组的东西开始。 –