使用Linq修改对象数据时Visual Studio不识别代码该如何解决
排查点1:Select委托签名不匹配导致编译错误
Linq的Select方法要求传入的lambda表达式必须有返回值,用来生成投影后的新序列。你当前的lambda仅包含修改逻辑,没有任何返回语句,传入的委托类型是Action<EmployeeRole>,和Select要求的Func<EmployeeRole, TResult>签名不兼容,这是VS无法识别运行的直接原因。
排查点2:Linq查询的副作用操作不符合设计规范
Linq被设计为无副作用的查询工具,本身不建议在查询逻辑中修改原对象的值。同时Linq默认是延迟执行的,只要你没有主动枚举查询结果,修改逻辑永远不会被触发,哪怕你强行修改代码让编译通过,也会有隐藏的执行逻辑问题。
推荐解决方案
直接先定位到目标对象再做修改,逻辑清晰且无兼容问题:
// 先查找符合条件的第一个对象 var todate = Filters.FirstOrDefault(it => it.Value == "ApplicationDateToSearch"); // 非空判断+格式校验后修改属性 if (todate != null && DateTime.TryParse(todate.Description, out DateTime ConvertedToDate)) { todate.Description = ConvertedToDate.AddHours(23).AddMinutes(59).AddSeconds(59).ToString(); }
如果需要批量修改所有符合条件的对象,可以用ForEach方法:
Filters.Where(it => it.Value == "ApplicationDateToSearch") .ToList() .ForEach(it => { if (DateTime.TryParse(it.Description, out DateTime ConvertedToDate)) { it.Description = ConvertedToDate.AddHours(23).AddMinutes(59).AddSeconds(59).ToString(); } });
内容的提问来源于stack exchange,提问作者GettingStarted
相关产品推荐
相关产品推荐

