簡體   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