使用值转换器时如何查询 Entity Framework core 中的实际值?

Rob*_*bba 6 entity-framework-core ef-core-6.0

我们有一个相当简单的情况,其中 EF Core 实体包含一个我们映射到字符串的值对象:

builder.Property(_ => _.Nummer)
    .HasConversion(i => i.ToString(), i => ZijdeNummer.FromString(i))
    .IsRequired().HasMaxLength(9);
Run Code Online (Sandbox Code Playgroud)

这对于检索和存储来说效果很好,但对于过滤,我们正在寻找一种按子字符串过滤行的方法。如果它是一个普通的string列,你可以简单地执行如下操作:

dbSet.TheTable.Where(t => t.Nummer.Contains("some text")).ToList()
Run Code Online (Sandbox Code Playgroud)

显然该自定义ZijdeNummer不包含可识别的.Contains()方法。我尝试过使用.ToString().Contains(),但是可惜,这也不起作用。

最后,我还尝试访问该列,就好像它是影子属性一样:

dbSet.TheTable.Where(t => EF.Property<string>(t, "Nummer").Contains("some text"))
Run Code Online (Sandbox Code Playgroud)

但它不会被愚弄,因为它仍然知道这EF.Property<T>(t, "Nummer")实际上不是一个字符串:(

有没有办法让 EF-Core 只查询原始列类型?

Rob*_*bba 11

事实证明这比您想象的要容易得多。只需将类型转换为字符串(如果不存在转换,则首先转换为对象)并执行比较:

dbSet.TheTable.Where(t => ((string)(object)t.Nummer).Contains("some text")).ToList()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,我从来没想过要自己做这件事。当尝试执行对从长持有报价映射映射的一组时间跨度字段求和的常见任务时,这特别有用。 (3认同)