C#用Dynamic Linq查询嵌套对象集合时触发Value cannot be null错误
异常触发原因
堆栈信息显示异常出现在System.Linq.Expressions.Expression.Bind方法执行时,该方法要求传入的成员赋值表达式不能为空,触发空参数异常的具体原因有3个:
- 属性名大小写不匹配:Dynamic Linq解析时严格区分大小写,你代码中写的
firstname、lastname、email与实体类定义的FirstName、LastName、Email命名不一致,解析器无法找到对应成员,返回空表达式。 - 嵌套集合投影语法不完整:对
UserAddresses这类集合做Select投影时,Dynamic Linq要求明确指定集合元素的临时参数名,你直接写Select(new ...)省略了lambda参数部分,解析器无法生成正确的集合投影表达式,返回空值。 - 泛型参数与投影目标类型不匹配:你调用
Select方法时传入的泛型参数是Domain.UserManagement,但实际要投影的目标类型是Domain.UserManagement.Users.User,类型不匹配导致成员绑定失败。
正确实现方案
修正投影语句的语法、属性名和类型参数即可正常执行,示例代码如下:
// 源为IQueryable<User>类型的查询 var result = query.Select<Domain.UserManagement.Users.User>( @"new Domain.UserManagement.Users.User { Id, FirstName, LastName, Email, UserAddresses.Select(ua => new Domain.UserManagement.UserAddresses.UserAddress{ Country }) as UserAddresses }" ).ToDynamicArray();
补充注意事项
- 如果嵌套集合可能为空,可以在投影前加空判断,避免运行时空引用异常:
UserAddresses == null ? null : UserAddresses.Select(ua => new UserAddress{ Country }) - 如果用EF Core等ORM执行该查询,无需额外配置即可正常转译为SQL,只会查询你指定的列,不会加载多余字段。
内容的提问来源于stack exchange,提问作者Peter Siegel
相关产品推荐
相关产品推荐

