首页 文章

实体框架按周数查询获取

提问于
浏览
0

我面临的是申请层(c#)我周一设定了我的第一天 . SQL Server认为我这周的第一天是星期天 . SQL Server错了 . How can tell my query that the first day of the week is Monday? 您可以在下面找到我的代码 .

public static class DateTimeExtensions
{   
    // Extension method to get the weeknumber from a date
    public static int Weeknumber(this DateTime date)
    {
        var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
        return cal.GetWeekOfYear(date, 
                      System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday);
    }
}

要获取游戏,我使用以下查询:

var weeknumber = DateTime.Now.Weeknumber();
var games = db.Games
              .Where(x => SqlFunctions.DatePart("week", x.Date) == weeknumber)
              .ToList();

3 回答

  • 0

    感谢您的建议,但我是以自己的方式做到的 . 下面你可以找到我做的方式 .

    首先,我在DateTime对象上创建了2个扩展方法:

    public static class DateTimeExtensions
    {
        public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
        {
            int diff = dt.DayOfWeek - startOfWeek;
            if (diff < 0)
            {
                diff += 7;
            }
    
            return dt.AddDays(-1 * diff).Date;
        }
        public static DateTime EndOfWeek(this DateTime dt, DayOfWeek endOfWeek = DayOfWeek.Sunday)
        {
            if (dt.DayOfWeek == endOfWeek)
            {
                return dt.Date.Date.AddDays(1).AddMilliseconds(-1);
            }
            else
            {
                var diff = dt.DayOfWeek - endOfWeek;
                return dt.AddDays(7 - diff).Date.AddDays(1).AddMilliseconds(-1);
            }
        }
    }
    

    我使用这些方法在查询中获取范围:

    var start = DateTime.Now.StartOfWeek();
    var end = DateTime.Now.EndOfWeek();
    var games = db.Games
                .Where(x => x.Date >= start && x.Date <= end )
                .OrderBy(x => x.Team.MinAge)
                .ToList();
    

    我用这种方式所以我不会依赖数据库功能 . 另外我认为我的应用程序逻辑实际上在应用程序中是一件好事 . 数据库不应该关心一周的开始和结束日期 .

  • 0

    您可以通过t-SQL语句SET DATEFIRST更改一周的第一天 . 周一这是:

    SET DATEFIRST 1;
    

    但请注意,此更改的范围限定为连接,因此您必须在每次EF打开连接时设置它,或者将连接文化设置为在一周的第一天具有不同的默认值 . 有关更多背景信息,请参阅How to Set DateFirst SQL Function Return for a SQL Server Database Scope Permanent

  • 3

    在获取日期部分之前,您还可以从x.Date中减去1天 . 如果您无法调整数据库以执行此操作 . 这使周日回到上周,并使周一成为第一天 .

相关问题