EF访问PostgreSql,如何判断jsonb类型的数组是否包含某个数值,另外,Dictionary<string,string>的注意事项

下面代码判断OpenUserIds(long[]类型的jsonb)字段,是否包含 8

    basequery = basequery.Where(m => Microsoft.EntityFrameworkCore.NpgsqlJsonDbFunctionsExtensions.JsonContains(EF.Functions, m.OpenUserIds, new long[] { 8 }));
          

Dictionary<string,string>的注意事项

如果jsonb属性的类型是Dictionary<string,string>,在查询时会有问题,例如,字段name,在数据库中这样存储:

    { "zh-CN" : "测试" , "en-US" : "test" }
          

在EF中要查询英文信息,这样查询会报错

    from m in db.table1
    where m.name["en-US"] == "test"
    select m          

解决方案

创建一个类,继承 Dictionary<string,string>,并增加一个enUS属性

    public class MultiLang:Dictionary<string,string>
    {
        [JsonPropertyName("en-US")]
        public string enUS { get; set; }
    }  

把josnb的属性改为MultiLang,这样,在EF中就可以这样查询了:

    from m in db.table1
    where m.name.enUS == "test"
    select m          

enUS属性其实没有实际作用,它就是给EF查询时,做一个转义的桥梁而已

F:\gitee\ims-iot-gateway\host\Ycims.IotGateway.HttpApi.Host>dotnet ef database update Build started... Build succeeded. System.ArgumentException: Couldn't set trusted_connection (Parameter 'trusted_connection') ---> System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. at Npgsql.NpgsqlConnectionStringBuilder.GeneratedActions(GeneratedAction action, String keyword, Object& value) at Npgsql.NpgsqlConnectionStringBuilder.set_Item(String keyword, Object value) --- End of inner exception stack trace --- at Npgsql.NpgsqlConnectionStringBuilder.set_Item(String keyword, Object value) at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value) at Npgsql.NpgsqlConnectionStringBuilder..ctor(String connectionString) at Npgsql.NpgsqlConnection.SetupDataSource() at Npgsql.NpgsqlConnection.set_ConnectionString(String value) at Npgsql.NpgsqlConnection..ctor(String connectionString) at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlRelationalConnection.CreateDbConnection() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.get_DbConnection() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations() at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlHistoryRepository.GetAppliedMigrations() at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlMigrator.Migrate(String targetMigration) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) Couldn't set trusted_connection (Parameter 'trusted_connection')这个报错是因为什么原因?
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值