繁体   English   中英

where 查询中的 EF Core + 枚举参数

[英]EF Core + enum parameter in where query

我挣扎枚举添加到where的条件我有我的查询。

我对我的班级有以下定义:

public enum Status
{
  Pending,
  Confirmed
}

public class Deposit
{
  public Status Status { get; set; }
}

每当我添加一个带有原始枚举值的where条件时,就像下面的例子一样,它工作得很好:

query.Where(d => d.Status == Status.Completed);

// Generated query:
Executed DbCommand (40ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT d.*
FROM deposit AS d
WHERE d.status = 'Completed'

每当我尝试将此枚举值添加为参数时,它都会在以下查询中失败:

query.Where(d => d.Status == input.Status);

// Generated query:

Failed executing DbCommand (244ms) [Parameters=[@__searchInput_Status_Value_0='Completed' (Nullable = false)], CommandType='Text', CommandTimeout='30']
SELECT d.*
FROM deposit AS d
WHERE d.status = @__searchInput_Status_Value_0

如果我尝试在我的模型创建中转换这个枚举,我会一直遇到同样的错误,无论是string还是int转换:

对于字符串转换:

modelBuilder.Entity<Deposit>()
  .Property(d => d.Status)
  .HasConversion(new EnumToStringConverter<Status>());

Npgsql.PostgresException (0x80004005): 42883: operator does not exist: enum_deposit_status = text

对于 int 转换:

modelBuilder.Entity<Deposit>()
  .Property(d => d.Status)
  .HasConversion<int>();

Npgsql.PostgresException (0x80004005): 42883: operator does not exist: enum_deposit_status = integer

有人可以对此有所了解吗? 谢谢大家!! :)

这似乎是 PostgreSQL EF Core 提供程序中的一个问题。

以下解决方法应该可以解决它,但存在版本限制; 请参阅下面的注释。

地图:

modelBuilder.Entity<Deposit>()
  .Property(d => d.Status)
  .HasConversion(new EnumToStringConverter<Status>());

代码:

var statusFilter = new[] { input.Status };
query.Where(d => statusFilter.Contains(d.Status));

有关受影响版本的说明

上述解决方法适用于Npgsql.EntityFrameworkCore.PostgreSQL版本Npgsql.EntityFrameworkCore.PostgreSQL (希望 6.0,没有检查它)

版本 3 和 5 以不同的方式翻译代码:

  • 3.0(使用 EF 3.x)

     info: Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (7ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] SELECT d.* FROM deposit AS d WHERE d.status IN ('Completed')
  • 5.0(使用 EF 5.x)

     info: Microsoft.EntityFrameworkCore.Database.Command[20101] Executed DbCommand (15ms) [Parameters=[@__statusFilter_0='?' (DbType = Object)], CommandType='Text', CommandTimeout='30'] SELECT d.* FROM deposit AS d WHERE b.status = ANY (@__statusFilter_0)

它不会在 3.1 中工作; 它因几乎相同的错误而失败:

  • 3.1 (EF 3.x)
     fail: Microsoft.EntityFrameworkCore.Database.Command[20102] Failed executing DbCommand (18ms) [Parameters=[@__statusFilter_0='?' (DbType = Object)], CommandType='Text', CommandTimeout='30'] SELECT d.* FROM deposit AS d WHERE b.status = ANY (@__statusFilter_0) fail: Microsoft.EntityFrameworkCore.Query[10100] An exception occurred while iterating over the results of a query for <...>. Npgsql.PostgresException (0x80004005): 42883: operator does not exist: character varying = integer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM