繁体   English   中英

实体框架按周数获取查询

[英]Entity Framework get by weeknumber query

我正在为体育俱乐部创建一个应用程序。 在主页上,我想显示本周将要玩的所有游戏的概述。 我面临的问题是,在应用程序层(c#)上,我将周一的第一天设置为星期一。 SQL Server认为我的第一天是星期天。 SQL Server错误。 怎么能告诉我我的查询是一周的第一天是星期一? 在下面可以找到我的代码。

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

感谢您的建议,但我以自己的方式做了。 您可以在下面找到我的操作方式。

首先,我对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();

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

您可以通过t-SQL语句SET DATEFIRST更改一周的第一天。 对于星期一,这是:

SET DATEFIRST 1;

但是请注意,此更改仅限于连接,因此您必须在每次EF打开连接时进行设置,或者将连接区域设置为在一周的第一天使用不同的默认设置。 有关更多背景,请参见如何为SQL Server数据库作用域永久设置DateFirst SQL函数返回

您也可以从x.Date中减去1天,然后再加上日期部分。 如果您无法调整数据库来执行此操作。 这使星期日回到上周,并使星期一成为第一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM