具有可选导航属性的嵌套 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 (将#修改为@)