EF Core 过滤器枚举使用 LIKE 运算符存储为字符串

KDa*_*ani 6 c# entity-framework-core .net-core ef-core-3.1

我有一个Person带有枚举属性的模型Gender,它作为字符串存储在数据库中。我想进行查询以按性别的子字符串过滤数据。例如,如果query.SearchLike"Fe""em",我想找回所有女性。不幸的是,下面的代码抛出异常。

builder.Entity<Person>().Property(x => x.Gender).HasConversion<string>();
Run Code Online (Sandbox Code Playgroud)
public async Task<IList<Person>> ListAsync(PersonsQuery query)
{
  IQueryable<Person> queryable = _context.Persons.AsNoTracking();

  return await queryable
    .Where(x => x.Gender.ToString().Contains(query.SearchLike))
    .ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

例外:

无法翻译 LINQ 表达式 'DbSet\r\n .Where(x => x.Gender.ToString().Contains(__query_SearchLike_0))'。以可翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端计算。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038 。

KDa*_*ani 3

我找到了解决方案。首先需要将枚举转换为object,然后转换为string

public async Task<IList<Person>> ListAsync(PersonsQuery query)
{
  IQueryable<Person> queryable = _context.Persons.AsNoTracking();

  return await queryable
    .Where(x => ((string)(object)x.Gender).Contains(query.SearchLike))
    .ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

EF Core Github 存储库中的相关问题。