c# - 具有可选导航属性的嵌套 DTO:“在类型 'Expression[]' 和匿名类型之间未定义强制运算符”
问题描述
我正在尝试使用导航属性构建带有实体框架(6.2.0)的嵌套 DTO。导航属性是可选的,因此我需要以 DTO 的相应属性也为 null 的方式处理 null 值:
var result = db.Projects.Select(
p => new
{
p.Id,
Notifications = p.Notifications
.Where(n => n.ContactId == user.Id)
.Select(a => new
{
a.Id,
a.ContactId,
Candidate = a.Candidate == null ? null : new
{
a.Candidate.Id,
a.Candidate.LastName
}
})
.OrderByDescending(n => n.Timestamp)
})
.FirstOrDefault(p => p.Id == projectId);
如代码所示,在我的模型中,有Project
0-n 的实体Notifications
,其中 aNotification
可以选择有一个Candidate
。
上面的代码抛出:
System.InvalidOperationException:'没有强制运算符在类型'System.Linq.Expressions.Expression[]'和'<>f__AnonymousType43`2[System.Int32,System.String]'之间定义。
在运行时。如果我像这样删除空检查
Candidate = new
{
a.Candidate.Id,
a.Candidate.LastName
}
Candidate
当属性为空时,它预期会引发异常。Null 传播也不起作用,而且 - 即使它起作用了 - 也不符合 DTO 属性Candidate
应该为 null 而不是具有 null 属性值的对象的要求:
Candidate = new
{
Id = a.Candidate?.Id,
LastName = a.Candidate?.LastName
}
这不会编译:
表达式树 lambda 可能不包含空传播运算符。
- 如何基于(可选)导航属性创建具有可选属性的嵌套 DTO?
- 对于这个(不是那么奇特?)要求,什么被认为是最佳实践?
作为参考,导航属性的定义:
modelBuilder.Entity<Project>(entity =>
{
// ...
entity.HasMany(p => p.Notifications)
.WithOne(a => a.Project)
.HasForeignKey(a => a.ProjectId)
.IsRequired(false)
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity<Notification>(entity =>
{
// ...
entity.HasOne(e => e.Candidate)
.WithMany(c => c.Notifications)
.HasForeignKey(e => e.CandidateId)
.HasPrincipalKey(e => e.Guid)
.IsRequired(false)
.OnDelete(DeleteBehavior.SetNull);
});
解决方案
推荐阅读
- docker - 如何使用 Docker 列出可用的 repo 版本
- c# - 如何从嵌套列表中删除重复行?
- ios - 快速在动态表格视图单元格中使用 JSON 响应
- python - 等效于 str.format 的 Keras 后端函数
- wpf - 最简单的跨分辨率应用程序和自适应 UI 构建。不能在 WPF 中做到这一点
- c# - 在 app.config 中获取 ConfigurationElement 父级
- ocaml - OCaml- 评估函数时出错(此表达式的类型为 'a * 'b 但表达式应为 ('a * 'b) list# 类型)
- python - 加载 numpy 时本地脚本与内置模块冲突
- ssl - 如何找到 ssl / tls 主密钥
- go - 在 golang 中解析 yaml 时出错