我在Server中使用.NET 6和EF 6,并希望使用新的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‘的翻译失败。如果可以将此方法映射到您的自定义函数,请参阅https://go.microsoft.com/fwlink/?linkid=2132413获取更多信息。 方法'object.ToString‘的翻译失败。如果可以将此方法映射到您的自定义函数,请参阅https://go.microsoft.com/fwlink/?linkid=2132413获取更多信息。可以用可以翻译的表单重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用,显式地切换到客户端计算。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。
我如何告诉Linq执行类似before的操作,并在将代码转换为SQL之前,将类型转换为DateTime?这个是可能的吗?
或者如何将ToString()调用注册到Linq?例外的链接并不能真正帮助我。
发布于 2022-08-01 12:04:31
这应该是可行的,尽管不是那么可读的。如果存在的话,使用索引会带来好处。此外,如果只使用年份部分,则使用DateOnly作为参数的契约会使人感到困惑。
public XXXXByDateSpec(int year)
{
Query.Where(x => x.ValidFrom < new DateOnly(year + 1, 1, 1);
}https://stackoverflow.com/questions/73193111
复制相似问题