首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用带有ef核的DateOnly查询Server

如何使用带有ef核的DateOnly查询Server
EN

Stack Overflow用户
提问于 2022-08-01 11:42:11
回答 1查看 424关注 0票数 1

我在Server中使用.NET 6和EF 6,并希望使用新的DateOnly类型。

我已经能够使用这个转换器将数据读写到数据库中,但是查询表不起作用,因为Linq不知道如何翻译DateOnly

DbContext中的转换器配准

代码语言:javascript
复制
protected override void ConfigureConventions
(ModelConfigurationBuilder builder)        
{
    builder.Properties<DateOnly>()                
        .HaveConversion<DateOnlyConverter>()                
        .HaveColumnType("date");
    builder.Properties<DateOnly?>()                
        .HaveConversion<NullableDateOnlyConverter>()                
        .HaveColumnType("date");        
}

示例

代码语言:javascript
复制
    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时,也会出现类似的错误。

代码语言:javascript
复制
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?例外的链接并不能真正帮助我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-01 12:04:31

这应该是可行的,尽管不是那么可读的。如果存在的话,使用索引会带来好处。此外,如果只使用年份部分,则使用DateOnly作为参数的契约会使人感到困惑。

代码语言:javascript
复制
 public XXXXByDateSpec(int year)
 {
    Query.Where(x => x.ValidFrom < new DateOnly(year + 1, 1, 1);
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73193111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档