【问题标题】:Linq join two objects of the same typeLinq 连接两个相同类型的对象
【发布时间】:2013-10-07 15:25:04
【问题描述】:

我怎样才能让它工作?我不断收到错误消息,指出 r 在当前上下文中不存在(我放 ** 的地方)。

                    var query = (
                        from p in PrerequisitesList
                        join r in RequirementStatus
                        on p.ID equals r.ID
                        into temp
                        from r in temp.DefaultIfEmpty(new RequirementStatus(p.ID, p.Name, p.Description, **r.Fulfilled**))
                        select new
                        {
                            p.ID
                            ,p.Name
                            ,p.Description
                            ,r.Fulfilled
                        });

两种类型完全相同,因此单独的值会被覆盖。

【问题讨论】:

  • “完全相同”是指“具有完全相同的属性”吗?
  • @D Stanley - 正确@AD.Net - 它没有,我得到一个预编译错误。
  • @CBauer 仅仅因为两种类型具有相同的属性并不意味着它们是相同的类型。你不能像它们是同一类型的集合一样加入它们。

标签: c# asp.net linq join


【解决方案1】:

DefaultIfEmpty 方法本质上提供了一个左外连接。这意味着,如果连接没有以正确的顺序找到匹配项,则它是您的后备。如果正确的项目为空,我们就无法真正访问它,对吧?

你必须弄清楚其他事情,因为你犯了一个逻辑错误。

也许您可以通过实际提供默认值来解决它?

类似这样的:

temp.DefaultIfEmpty(new RequirementStatus(p.ID, p.Name, p.Description, false))

此外,右侧列表的名称与稍后使用的 RequirementStatus 类型相同,这使您的示例无法编译。但这可能是一个错字。

【讨论】:

    【解决方案2】:

    我可以看到您在查询中使用了 2 个rs,select new 中的r 可能引用了join r 中的r,它超出了范围。无论哪种方式,您都必须使用其他名称。

    var query = ( from p in PrerequisitesList
                  join r in RequirementStatus on p.ID equals r.ID into temp
                  from r2 in temp.DefaultIfEmpty(new RequirementStatus(p.ID, p.Name, p.Description, p.Fulfilled))
                  select new {
                            p.ID,
                            p.Name,
                            p.Description,
                            r2.Fulfilled
                  });
    

    【讨论】:

    • 感谢通知,但错误仍然出现在第3行。
    • @CBauer 即使您可以通过这种方式访问​​r,这也没有任何意义,因为当temp 为空时,您没有任何r 分组,所以你怎么能访问它?我想你的意思是p.Fulfilled,而不是r.Fulfilled
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2015-06-23
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多