【问题标题】:Linq query to get per day status of a monthLinq查询以获取一个月的每天状态
【发布时间】:2015-05-20 20:03:00
【问题描述】:

下面是用户不可用表。

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 获取每月每一天的数据?

【问题讨论】:

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


    【解决方案1】:

    试试这个代码(用于本地用户集合,而不是 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();
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      我觉得这样就可以了

      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();
      

      【讨论】:

      • 但我需要一次获取一个月的数据,而不是全年的数据。
      • 您所要做的就是将 totalDayCount 更改为 DateTime.DaysInMonth .... 之类的东西,并将 startDay 更改为该月的第一天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多