I have a catch-22 with linq outer joins in runtime 2.6.
Originally I got 'Extension node must override the property Expression.NodeType' with a new project. This was solved by using a runtime later than 7-7-2010. I actually used 25-12-2010.
But then production code was compromised. An expression (= 'Week', in the 4th line) was not evaluated any more. The problem:
var queryResultWrong =
from prs in db.WerknPeriodeTotalen
join me in db.WerknWeekMemo
on new { prs.BedrijfNummer, prs.AdministratieNummer, Week = prs.PeriodeNummer + 1, prs.PersoonNummer }
equals new { me.BedrijfNummer, me.AdministratieNummer, me.Week, me.PersoonNummer }
into optMemo
from om in optMemo.DefaultIfEmpty()
select new WerknemerTotalenDto()
{
BedrijfNummer = prs.BedrijfNummer,
AdministratieNummer = prs.AdministratieNummer,
PeriodeNummer = prs.PeriodeNummer,
PersoonNummer = prs.PersoonNummer
};
List<WerknemerTotalenDto> resultFout = queryResultWrong.ToList();
The message 'The multi-part identifier \"LPLA_1.LPFA_3\" could not be bound.' comes at runtime.
We have a workaround by splitting the query in 2 parts and do the expression in the first part, but we do not know if this construct is used in other places. The workaround:
var queryResultOK1 =
from prs in db.WerknPeriodeTotalen
select new
{
prs.BedrijfNummer,
prs.AdministratieNummer,
prs.Jaar,
prs.PeriodeNummer,
prs.PersoonNummer,
Week = prs.PeriodeNummer + 1,
};
var queryResultOK2 =
from prs in queryResultOK1
join me in db.WerknWeekMemo
on new { prs.BedrijfNummer, prs.AdministratieNummer, prs.Week, prs.PersoonNummer }
equals new { me.BedrijfNummer, me.AdministratieNummer, me.Week, me.PersoonNummer }
into optMemo
from om in optMemo.DefaultIfEmpty()
select new WerknemerTotalenDto()
{
BedrijfNummer = prs.BedrijfNummer,
AdministratieNummer = prs.AdministratieNummer,
PeriodeNummer = prs.PeriodeNummer,
PersoonNummer = prs.PersoonNummer
};
List<WerknemerTotalenDto> resultOK = queryResultOK2.ToList();
Workaround works OK.
At this moment I work with 2 different runtimes (we do not dare to use the newer for production). A single set would be nicer.