使用LINQ ToLookup分组职位订单后无法获取实际属性值的问题
问题分析与解决办法
你遇到的问题很典型——直接输出LINQ查询返回的序列对象,而不是序列里的实际内容,所以Console.WriteLine只会打印它的类型信息,而不是你想要的jobName值。
问题根源
你用ToLookup得到的accountManagerObject是一个分组集合,每个分组(也就是foreach里的jobId,其实叫group更准确)是IGrouping类型,包含一个分组键(accountmangerid)和该键对应的所有职位订单数据。当你调用jobId.Select(o=>o.jobName)时,得到的是一个可枚举的字符串序列,而不是单个字符串。直接把这个序列传给Console.WriteLine,.NET会默认调用它的ToString()方法,自然就输出了序列的类型名称。
修复方案
根据你的需求,有两种常用的处理方式:
1. 把同一账户经理下的所有职位名称拼接成字符串输出
如果想把每个账户经理对应的所有jobName用分隔符连起来打印,可以用string.Join:
var accountManagerObject = (from j in api.hc_joborderSet where j.statecode == hc_joborderState.Active && j.hc_systemuser_hc_joborder_AccountManager != null && j.hc_ExpirationDate <= dateFilter select new { AccountManagerId = j.hc_AccountManager.Id, JobId = j.Id, JobName = j.LogicalName }).ToLookup(o => o.AccountManagerId); foreach (var managerGroup in accountManagerObject) { Console.WriteLine($"账户经理ID: {managerGroup.Key}"); // 用逗号分隔所有职位名称 var jobNames = string.Join(", ", managerGroup.Select(o => o.JobName)); Console.WriteLine($"关联职位名称: {jobNames}\n"); }
2. 逐个打印每个职位的详细信息
如果想单独输出每个职位的ID和名称,可以嵌套一个foreach遍历分组里的每个元素:
var accountManagerObject = (from j in api.hc_joborderSet where j.statecode == hc_joborderState.Active && j.hc_systemuser_hc_joborder_AccountManager != null && j.hc_ExpirationDate <= dateFilter select new { AccountManagerId = j.hc_AccountManager.Id, JobId = j.Id, JobName = j.LogicalName }).ToLookup(o => o.AccountManagerId); foreach (var managerGroup in accountManagerObject) { Console.WriteLine($"=== 账户经理ID: {managerGroup.Key} ==="); foreach (var job in managerGroup) { Console.WriteLine($"职位ID: {job.JobId},职位名称: {job.JobName}"); } Console.WriteLine(); }
小提示
我给匿名类型的属性改了更清晰的名字(比如AccountManagerId代替accountmangerid),这样代码可读性会更好,后续维护也更方便。
内容的提问来源于stack exchange,提问作者amberl
相关产品推荐
相关产品推荐

