我怎样才能让它发挥作用?我一直收到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
});
两种类型都完全相同,因此个别值会被覆盖。
答案 0 :(得分:2)
方法DefaultIfEmpty
实质上提供左外连接。这意味着如果连接在正确的序列中找不到匹配项,那么它就是您的后备。如果正确的项目为空,我们无法真正访问它,对吧?
你必须弄明白别的东西,因为你犯了一个逻辑错误。
也许您可以通过实际提供默认值来解决它?
这样的事情:
temp.DefaultIfEmpty(new RequirementStatus(p.ID, p.Name, p.Description, false))
此外,右侧列表的名称与后面使用的RequirementStatus
类型相同,这使您的示例无法编译。但这可能是一个错字。
答案 1 :(得分:1)
我可以看到您在查询中使用了2 r
个,r
中的select new
可能会引用r
中的join 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
});