[英]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 中工作; 它因几乎相同的错误而失败:
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.