Externe declarație de conectare în LINQ

Încerc să creez o declarație externă în LINQ și nu am mult noroc. Știu că realizarea unei legături externe necesită doi pași:

(1) Conversia join-ului într-un grup care se alătură cu

(2) Utilizați DefaultIfEmpty() pentru a genera valoarea nulă pe care o așteptați dacă setul de rezultate asociat este gol.

Am folosit acest cod ca exemplu:

var query = (from p in dc.GetTable()
join pa in dc.GetTable() on p.Id equals pa.PersonId into tempAddresses
from addresses in tempAddresses.DefaultIfEmpty()
select new { p.FirstName, p.LastName, addresses.State });

Așa că am încercat să fac asta:

var outerJoin =

    from h in resultHours         
    join u in results on h.Key equals u.Key into outer
    from dictionary in outer.DefaultIfEmpty()
    select new { 

Problema este că intellisense nu recunoaște nimic în instrucțiunea selectare nouă {}. Am încercat u. și h., chiar dicționar.

Problema cu care se poate întâmpla este că încerc să mă înscriu în două dicționare. Nu pare să-mi placă asta, deși asta mi-a fost spus că trebuie să fac. În mod evident, fac ceva greșit sau nu înțeleg ceva.

Trebuie să mă alătur dictionarului results.Unit cu dictionarul resultHours.Hours, deoarece productia mea lipsește câmpuri unitId în anumite condiții. Făcând o îmbinare exterioară ar trebui să clarifică acest lucru.

Iată codul pentru rezultate:

var results = 

    (from v in VDimUnit     
        join vf in VFactEnergyAllocation on v.UnitKey equals vf.UnitKey
        join vd in VDimGadsEvent on vf.GadsEventKey equals vd.GadsEventKey
        join vt in VDimTime on vf.TimeKey equals vt.TimeKey 
    where typeCodes.Contains(vd.GadsEventTypeCode)
    && vt.YearNum >= (year - 3) && vt.YearNum <= year       
    group vf by new {v.PlantId, v.PhysicalUnitId, v.NetDependableCapacity, v.NetMaximumCapacity, 
    vt.MonthNum} into groupItem     
    select new {groupItem.Key.PlantId, groupItem.Key.PhysicalUnitId, groupItem.Key.NetMaximumCapacity,
    groupItem.Key.MonthNum, PO_HRS = groupItem.Sum(
    x=> (float)x.AllocatedEnergyMwh/groupItem.Key.NetDependableCapacity),
            UO_HRS = groupItem.Sum(x=> (float)x.AllocatedEnergyMwh/groupItem.Key.NetDependableCapacity),
        Unit = groupItem.Count(), groupItem.Key}).ToDictionary(x=> x.Key, x=> x);

Aici este codul pentru rezultatulHours:

var resultHours = 

    (from vt in VDimTime
        join vf in VFactEnergyAllocation on vt.TimeKey equals vf.TimeKey         
        join vd in VDimGadsEvent on vf.GadsEventKey equals vd.GadsEventKey
        join v in VDimUnit on vf.UnitKey equals v.UnitKey       

    group vt by new {v.PlantId, v.PhysicalUnitId, v.NetDependableCapacity, v.NetMaximumCapacity, 
        vt.MonthNum} into groupItem
    select new {groupItem.Key.PlantId, groupItem.Key.PhysicalUnitId, groupItem.Key.NetMaximumCapacity,
        Hours = groupItem.Count(), groupItem.Key}).ToDictionary(x=> x.Key.ToString(), x=> x.Hours); 

Aceasta este în prezent modul în care am rezultatele mele. Se va schimba după ce îmi voi da seama cum se face legătura exterioară.

var finalResults = 

    (from r in results
    orderby r.Key.MonthNum, r.Key.PlantId, r.Key.PhysicalUnitId
    select new {Site = r.Key.PlantId, Unit = r.Key.PhysicalUnitId, r.Key.MonthNum, Numerator = r.Value.PO_HRS, Denominator = 
        resultHours[r.Key.ToString()], Weight = r.Key.NetMaximumCapacity, Data_Indicator = DATA_INDICATOR, 
        Budgeted = budgetedPlannedOutageHrs, Industry_Benchmark = INDUSTRY_BENCHMARK, Comments = comments, 
        Executive_Comments = executiveComments, Fleet_Exec_Comments = fleetExecComments});

Sunt la o pierdere. Exemplele de conectare exterioară LINQ pe care le-am găsit nu se aplică atunci când se unește cu dicționarele.

0
@ Magnus: Pentru a fi sincer cu tine, nu sunt sigur. Eu nu cred acest lucru. Voi cerceta mai departe
adăugat autor Programming Newbie, sursa
Nu amesteci Linq2Sql și Linq2Object în aceeași declarație?
adăugat autor Magnus, sursa