asp.net 未比较链接到实体枚举

new9mtju  于 2023-01-22  发布在  .NET
关注(0)|答案(2)|浏览(119)

下面是我的枚举:

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

u1ehiz5o

u1ehiz5o1#

这个问题在Linq查询中可能更严重,例如您试图在筛选前使用SelectProjectTo进行投影。对于int/string这样的简单类型,这应该可以工作,但根据DTO的声明方式,您可能会给mpgsql带来问题。
例如,如果您的查询类似于:

var query = _context.Advertisements
    .Select(x => new AdvertisementDTO
    {
        // populate DTO
    }).Where(x => x.Status == searchValues.Status)
    // ....

那么npgsql在尝试解析DTO中的类型和searchValues中的枚举之间的类型时可能会出现问题。从异常详细信息的外观来看,npgsql试图“安全地”使用枚举并强制转换为int,但将其提供给PostgreSQL,导致SQL无效。我做了一些快速检查,DTO需要使用相同的枚举类型(C#抱怨如果DTO将值强制转换为int,幸运的是不能在AdvertStatus和int之间使用==)项目可能有类似值转换器或其他钩子的东西,试图转换枚举,这被带入混合中并加快了工作。
尝试在投影之前执行Where条件:

var query = _context.Advertisements
    .Where(x => x.Status == searchValues.Status)
    .Select(x => new AdvertisementDTO
    {
        // populate DTO
    })
    // ....

如果数据值存储为Int,那么这应该是现成的。npgsql确实支持Map到字符串(这需要ValueConverter)以及数据库声明的枚举。(https://www.postgresql.org/docs/current/datatype-enum.html)但是,Int列应该可以正常工作/w枚举。
如果这不起作用,我将尝试使用指向DB的新DbContext示例和具有该Enum的简单实体从该表加载行,以排除npgsql是否正确转换了Enum,只是为了排除主DbContext/models/DTO可能贡献的任何可能的转换器或其他代码。

j13ufse2

j13ufse22#

这都是我在更高的repo Select投影中的错误。
谢谢你们的帮助干杯。

相关问题