簡體   English   中英

如何使用帶 ef 核心的 DateOnly 查詢 SQL 服務器

[英]How to query SQL Server using DateOnly with ef core

我正在使用 .NET 6 和 EF Core 6 與 SQL 服務器並想使用新的DateOnly類型。

我已經能夠使用此轉換器將數據讀取和寫入數據庫,但是查詢表不起作用,因為 Linq 不知道如何翻譯DateOnly

DbContext中的轉換器注冊:

protected override void ConfigureConventions
(ModelConfigurationBuilder builder)        
{
    builder.Properties<DateOnly>()                
        .HaveConversion<DateOnlyConverter>()                
        .HaveColumnType("date");
    builder.Properties<DateOnly?>()                
        .HaveConversion<NullableDateOnlyConverter>()                
        .HaveColumnType("date");        
}

例子

    public XXXXByDateSpec(DateOnly validFrom)
    {
        Query.Where(x => x.ValidFrom.Year <= validFrom.Year);
    }

但這會導致以下異常。

System.InvalidOperationException:無法翻譯 LINQ 表達式 'DbSet().Where(c => c.ValidFrom.Year <= __validFrom_Year_1)'。
以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的調用顯式切換到客戶端評估。 有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=2101038

當我嘗試首先將其解析為DateTime時會導致類似的錯誤。

Query.Where(x => DateTime.Parse(x.ValidFrom.ToString()).Year <= DateTime.Parse(validFrom.ToString()).Year);

System.InvalidOperationException:無法翻譯 LINQ 表達式 'DbSet().Where(c => DateTime.Parse(c.ValidFrom.ToString()).Year <= __Parse_Year_0)'。 附加信息:方法“object.ToString”的翻譯失敗。 如果此方法可以映射到您的自定義 function,請參閱https://go.microsoft.com/fwlink/?linkid=2132413了解更多信息。
方法“object.ToString”的翻譯失敗。 如果此方法可以映射到您的自定義 function,請參閱https://go.microsoft.com/fwlink/?linkid=2132413了解更多信息。 以可翻譯的形式重寫查詢,或通過插入對“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的調用顯式切換到客戶端評估。 有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=2101038

如何告訴 Linq 像 EF Core 一樣做同樣的事情,然后在將代碼轉換為 SQL 之前將類型轉換為DateTime 這可能嗎?

或者如何注冊對 Linq 的ToString()調用? 異常中的鏈接並沒有真正幫助我。

這應該可以工作,盡管不那么可讀。 這得益於使用索引(如果存在)。 如果僅使用年份部分,則以 DateOnly 作為參數的合同也會令人困惑。

 public XXXXByDateSpec(int year)
 {
    Query.Where(x => x.ValidFrom < new DateOnly(year + 1, 1, 1);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM