微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有可选导航属性的嵌套 DTO:“类型 'Expression[]' 和匿名类型之间未定义强制运算符”

如何解决具有可选导航属性的嵌套 DTO:“类型 'Expression[]' 和匿名类型之间未定义强制运算符”

我正在尝试使用导航属性构建带有实体框架 (6.2.0) 的嵌套 DTO。导航属性是可选的,因此我需要以 DTO 的相应属性也为空的方式处理空值:

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,其中 Notification 可以可选一个 {{ 1}}。

上面的代码抛出:

system.invalidOperationException: '没有定义强制操作符 在类型 'System.Linq.Expressions.Expression[]' 和 'f__AnonymousType43`2[system.int32,System.String]'。'

在运行时。如果我像这样删除空检查

Candidate

Candidate = new { a.Candidate.Id,a.Candidate.LastName } 属性为 null 时,它预期会引发异常。 Null 传播也不起作用,并且 - 即使它起作用 - 也不符合 DTO 属性 Candidate 应该为 null 而不是具有 null 属性值的对象的要求:

Candidate

这不会编译:

表达式树 lambda 不能包含空传播运算符。

  • 如何基于(可选)导航属性创建具有可选属性的嵌套 DTO?
  • 对于这个(不是那么奇特?)要求,什么被认为是最佳实践?

参考,导航属性的定义:

Candidate = new
{
   Id = a.Candidate?.Id,LastName = a.Candidate?.LastName
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。