C#中基于实体内置字典的LINQ查询过滤方案问询
解决方案
针对EF Core无法翻译Dictionary索引查询的问题,有两种适配泛型场景的可行替代方案:
方法1:使用EF.Functions.JsonValue(EF Core 5+)
直接利用EF Core提供的JSON值提取函数,提取JSON列中指定路径的值进行判断。由于数据库中JSON布尔值以字符串形式存储,直接与"true"比较即可:
var query = await repository.GetQueryableAsync(); query = query.Where(i => EF.Functions.JsonValue(EF.Property<string>(i, "ExtraProperties"), "$.AutoGenerated") == "true");
方法2:使用JsonElement类型访问(EF Core 6+)
EF Core 6及以上支持将JSON列映射为JsonElement类型,通过其原生API访问属性值,EF能自动翻译为对应的SQL JSON查询:
var query = await repository.GetQueryableAsync(); query = query.Where(i => EF.Property<JsonElement>(i, "ExtraProperties").GetProperty("AutoGenerated").GetBoolean());
原代码报错原因
EF Core无法将C# Dictionary的索引操作(["AutoGenerated"])翻译为数据库可识别的JSON查询语句,必须使用EF提供的专属JSON API,才能让EF生成对应的SQL JSON函数调用。
内容的提问来源于stack exchange,提问作者Ali Mustafa
相关产品推荐
相关产品推荐

