Entity Framework Core中如何在Select里将集合转为拼接字符串?
在Entity Framework的Select中提取关联集合属性并转换格式
问题描述
我使用以下Select语句获取所需的4列数据:
var allUsers = await dbContext.AppUsers .Where(u => allUserIds.Contains(u.IdentityUsersId)) .Include(u => u.Following) .Select(u => new { u.Name, u.Email, u.Phone!.FormattedNumber, u.Following }) .ToListAsync();其中
Following是List<Organization>类型,我希望获取Organization.Name,能否在Select中返回List<string>?若可行,能否将其转为通过string.Join拼接而成的字符串?更新:添加C#标签,因这是Entity Framework中动态对象的使用问题,该问答可展示EF Select中动态对象的用法。
解决方案
1. 返回List<string>类型的组织名称列表
直接对Following集合做嵌套Select,提取每个Organization的Name属性即可,EF会自动解析为对应的SQL查询,无需额外Include(因为Select中已经明确指定了要提取的关联数据):
var allUsers = await dbContext.AppUsers .Where(u => allUserIds.Contains(u.IdentityUsersId)) .Select(u => new { u.Name, u.Email, u.Phone!.FormattedNumber, FollowingNames = u.Following.Select(org => org.Name).ToList() }) .ToListAsync();
2. 返回拼接后的字符串
如果需要将组织名称用指定分隔符拼接成单个字符串,EF Core 2.1及以上版本支持直接在LINQ查询中使用string.Join,它会被转换为数据库对应的聚合函数(比如SQL Server的STRING_AGG):
var allUsers = await dbContext.AppUsers .Where(u => allUserIds.Contains(u.IdentityUsersId)) .Select(u => new { u.Name, u.Email, u.Phone!.FormattedNumber, FollowingNames = string.Join(", ", u.Following.Select(org => org.Name)) }) .ToListAsync();
如果使用的是EF6或低版本EF Core,string.Join无法被EF解析为SQL,此时可以先将数据加载到内存,再在客户端完成拼接:
var allUsers = await dbContext.AppUsers .Where(u => allUserIds.Contains(u.IdentityUsersId)) .Include(u => u.Following) .Select(u => new { u.Name, u.Email, u.Phone!.FormattedNumber, u.Following }) .ToListAsync() // 在客户端处理字符串拼接 .Select(u => new { u.Name, u.Email, u.Phone, FollowingNames = string.Join(", ", u.Following.Select(org => org.Name)) }) .ToList();
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

