Linq查询获取每月一天的状态

时间:2015-05-20 20:03:01

标签: sql .net linq c#-4.0 linq-to-sql

以下是用户不可用表。

Id |  UserId | StartDate   | EndDate  
1  |   100   | 01-02-2015  | 01-03-2015  
2  |   101   | 10-02-2015  | 11-03-2015  
3  |   102   | 09-04-2015  | 11-05-2015  
3  |   100   | 01-05-2015  | 01-09-2015

我需要在日历中显示每天有多少用户不可用。日历将一次显示一个月的数据,每天显示不可用用户的数量。

如何从每月的每一天获取linq的数据?

2 个答案:

答案 0 :(得分:0)

我认为这样做会

int TotalDayCount = 365;
DateTime startDay = DateTime.Now;
var NoOneAvailable = (from x in Enumerable.Range(0, TotalDayCount)
let myday = startDay.AddDays(x)
where !datapoints.Any(f => f.start > myday && f.end < myday)
select myday).ToList();

答案 1 :(得分:0)

尝试此代码(用于本地用户集合,而不是linq to sql):

class User
{
    public int Id;
    public int UserId;
    public DateTime StartDate;
    public DateTime EndDate;
}

class Program
{
    static void Main(string[] args)
    {
        var users = new User[]{ 
            new User { Id = 1, UserId = 100, StartDate = new DateTime(2015,2,1), EndDate = new DateTime(2015,3,1) },
            new User { Id = 2, UserId = 101, StartDate = new DateTime(2015,2,10), EndDate = new DateTime(2015,3,11) },
            new User { Id = 3, UserId = 102, StartDate = new DateTime(2015,4,9), EndDate = new DateTime(2015,5,11) },
            new User { Id = 3, UserId = 100, StartDate = new DateTime(2015,5,1), EndDate = new DateTime(2015,9,11) }
        };
        var minDate = users.Select(x => x.StartDate).Min();
        var maxDate = users.Select(x => x.EndDate).Max();

        var counts = Enumerable
            .Range(0, Convert.ToInt32((maxDate - minDate).TotalDays))
            .Select(x => {
                var Date = minDate.AddDays(x);
                return new
                {
                    Date,
                    Count = users.Where(u => Date >= u.StartDate && Date <= u.EndDate).Count() 
                };
            }).Where(x => x.Count > 0)
            .ToArray();

    }
}