4

我怎样才能让它工作?我不断收到当前上下文中不存在 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
                        });

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

4

2 回答 2

2

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

你必须想出别的办法,因为你犯了一个逻辑错误。

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

像这样的东西:

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

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

于 2013-10-07T15:40:39.533 回答
1

我可以看到您r在查询中使用了 2 ,rinselect new可能指的是rinjoin 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
              });
于 2013-10-07T15:30:39.730 回答