下面是我的枚举:
public enum AdvertStatus
{
Active,
Archived
}
我的实体类型:
public record Advertisement
{
...
public AdvertStatus Status { get; set; }
...
}
在数据库中存储为int,数据库为Postree
当我试着这样比较时:
data = data.Where(x => x.Status == searchValues.Status);
实体框架抛出异常,内容如下:
. Status ==(int)__searchValues_Status_3)'无法转换。请以可以转换的形式重写查询,或者通过插入对"AsEnumerable"、"AsAsAsyncEnumerable"、"ToList"或"ToListAsync"的调用来显式切换到客户端计算。
我尝试解决这个问题:但它不起作用。
编辑1:data
是数据库表上下文IQueryable<AdvertisementDTO>
searchValues。状态类型为搜索筛选器中的AdvertStatus
2条答案
按热度按时间u1ehiz5o1#
这个问题在Linq查询中可能更严重,例如您试图在筛选前使用
Select
或ProjectTo
进行投影。对于int
/string
这样的简单类型,这应该可以工作,但根据DTO的声明方式,您可能会给mpgsql带来问题。例如,如果您的查询类似于:
那么npgsql在尝试解析DTO中的类型和searchValues中的枚举之间的类型时可能会出现问题。从异常详细信息的外观来看,npgsql试图“安全地”使用枚举并强制转换为
int
,但将其提供给PostgreSQL,导致SQL无效。我做了一些快速检查,DTO需要使用相同的枚举类型(C#抱怨如果DTO将值强制转换为int
,幸运的是不能在AdvertStatus和int
之间使用==
)项目可能有类似值转换器或其他钩子的东西,试图转换枚举,这被带入混合中并加快了工作。尝试在投影之前执行
Where
条件:如果数据值存储为Int,那么这应该是现成的。npgsql确实支持Map到字符串(这需要ValueConverter)以及数据库声明的枚举。(https://www.postgresql.org/docs/current/datatype-enum.html)但是,Int列应该可以正常工作/w枚举。
如果这不起作用,我将尝试使用指向DB的新DbContext示例和具有该Enum的简单实体从该表加载行,以排除npgsql是否正确转换了Enum,只是为了排除主DbContext/models/DTO可能贡献的任何可能的转换器或其他代码。
j13ufse22#
这都是我在更高的repo
Select
投影中的错误。谢谢你们的帮助干杯。