![](/img/trans.png)
[英]How to modify query in EF Core 2.0, before it goes to the SQL Server?
[英]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.