如何使用EF Core将{12,13}格式的文本转换为整数列表
解决方案
方案1:使用EF Core原生数据库函数解析(推荐)
针对支持STRING_SPLIT的数据库(如SQL Server 2016+),可以直接调用EF Core提供的数据库函数,在IQueryable中完成解析:
修改Select中的AddonDto构造逻辑:
Select(a => new AddonDto { AddonId = a.addon.id, AddonName = a.addon.add_on_name, AddonIds = EF.Functions.StringSplit( // 先去掉大括号和空格,再拆分字符串 EF.Functions.Replace(EF.Functions.Replace(s.answer.addon_ids, "{", ""), "}", ""), "," ).SplitResult.Select(x => int.Parse(x.Trim())).ToList() })
注:需确保EF Core版本支持EF.Functions.StringSplit,不同数据库的函数名称可能有差异(比如PostgreSQL用string_to_array)。
方案2:拉取到内存后解析
如果数据库不支持原生拆分函数,可先将数据查询到内存中,再用客户端方法解析:
在查询链中加入AsEnumerable()切换到内存处理:
var answers = await _context.OfferAnswers // 原有Where、Join逻辑保持不变 .AsEnumerable() // 切换到内存查询 .Select(s => new { // 其他属性保持不变 Addon = s.answer.addon_ids == null ? null : _context.add_Ons .Join(/* 原有Join逻辑 */) .AsEnumerable() .Select(a => new AddonDto { AddonId = a.addon.id, AddonName = a.addon.add_on_name, AddonIds = ParseAddonIds(s.answer.addon_ids) }) .ToList() }) .ToListAsync(); // 自定义解析方法 private List<int> ParseAddonIds(string addonIdsStr) { if (string.IsNullOrWhiteSpace(addonIdsStr)) return new List<int>(); return addonIdsStr.Trim('{', '}') .Split(',') .Select(x => int.Parse(x.Trim())) .ToList(); }
方案3:修改数据库设计(最优解)
从根源解决问题,建议将text列改为JSON类型(如SQL Server的JSON列、PostgreSQL的jsonb),或创建关联表存储多对多关系:
JSON列方案
在OfferAnswer实体中直接定义列表属性,EF Core自动映射JSON列:
public class OfferAnswer { // 其他属性 public List<int> addon_ids { get; set; } }
在DbContext中配置映射:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<OfferAnswer>() .Property(e => e.addon_ids) .HasColumnType("json") .HasConversion( v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize<List<int>>(v, null)); }
这样无需手动解析,EF Core会自动完成JSON与List<int>的转换。
内容的提问来源于stack exchange,提问作者Kamran Khan
相关产品推荐
相关产品推荐

