【发布时间】:2021-11-13 19:16:47
【问题描述】:
我正在努力将枚举添加到我的查询中的 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
有人可以解释一下吗? 谢谢大家!! :)
【问题讨论】:
-
“在以下查询中失败”。在这种情况下,您看到了什么错误?
-
什么是
enum_deposit_status?如果是PostgreSQL enum type,则需要特殊的mapping in Npgsql provider。在使用string或int转换时,您必须更改数据库列类型。 -
@Sasha 我看到的错误是我上面显示的这个错误:“运算符不存在:enum_deposit_status =
或 ”。还有一个提示:“没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。” -
@IvanStoev 映射没有帮助。错误仍然存在。每当添加一个值作为原始比较时,它都会起作用。参数比较不行,好像
-
@Kiwanax 如果你这样做
query.Where(d => d.Status == (int)input.Status);会发生什么?
标签: c# enums entity-framework-core