Entity Framework 按周数查询获取
Entity Framework get by weeknumber query
我正在为体育俱乐部创建应用程序。在主页上,我想展示本周将要进行的所有游戏的概览。我面临的问题是,在应用程序层 (c#) 上,我将一周的第一天设置为星期一。 SQL 服务器认为我一周的第一天是星期天。 SQL服务器错误。 如何告诉我的查询一周的第一天是星期一?您可以在下面找到我的代码。
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();
您可以通过 t-SQL 语句 SET DATEFIRST
更改一周的第一天。星期一是:
SET DATEFIRST 1;
但是请注意,此更改仅限于一个连接,因此您必须在每次 EF 打开连接时设置它,或者将连接文化设置为在一周的第一天具有不同的默认值。有关更多背景信息,请参阅 How to Set DateFirst SQL Function Return for a SQL Server Database Scope Permanent
您还可以在计算日期部分之前从 x.Date 中减去 1 天。如果您无法调整数据库,请这样做。这将星期日带回到前一周,并使星期一成为第一天。
感谢您的建议,但我按照自己的方式做了。下面你可以找到我做的方法。
首先,我在 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();
我就是这样使用的,所以我不会依赖数据库函数。此外,我认为我的应用程序逻辑实际上在应用程序中是一件好事。数据库不应该关心一周的开始日期和结束日期是什么日期。
我正在为体育俱乐部创建应用程序。在主页上,我想展示本周将要进行的所有游戏的概览。我面临的问题是,在应用程序层 (c#) 上,我将一周的第一天设置为星期一。 SQL 服务器认为我一周的第一天是星期天。 SQL服务器错误。 如何告诉我的查询一周的第一天是星期一?您可以在下面找到我的代码。
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();
您可以通过 t-SQL 语句 SET DATEFIRST
更改一周的第一天。星期一是:
SET DATEFIRST 1;
但是请注意,此更改仅限于一个连接,因此您必须在每次 EF 打开连接时设置它,或者将连接文化设置为在一周的第一天具有不同的默认值。有关更多背景信息,请参阅 How to Set DateFirst SQL Function Return for a SQL Server Database Scope Permanent
您还可以在计算日期部分之前从 x.Date 中减去 1 天。如果您无法调整数据库,请这样做。这将星期日带回到前一周,并使星期一成为第一天。
感谢您的建议,但我按照自己的方式做了。下面你可以找到我做的方法。
首先,我在 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();
我就是这样使用的,所以我不会依赖数据库函数。此外,我认为我的应用程序逻辑实际上在应用程序中是一件好事。数据库不应该关心一周的开始日期和结束日期是什么日期。