2016-07-18 4 views
6

Ich versuche, 2 Links Joins zu tun. Ich habe die Abfrage in SQL Server getestet und es funktioniert, aber ich kann die Abfrage in linq nicht neu erstellen.NullReferenceException bei der Auswahl von Links Join

Die Abfrage:

select Master.InvoiceId,Consumer.ConsumerId,ConsumerCharge.ChargeId , Amount 
from Master 

left outer join Consumer on 
Master.InvoiceId=Consumer.InvoiceId 

left outer join ConsumerCharge on 
Consumer.ConsumerId = ConsumerCharge.ConsumerId and 
Consumer.InvoiceId = ConsumerCharge.InvoiceId and 
Master.InvoiceId = ConsumerCharge.InvoiceId 

order by InvoiceId 

In LINQ:

var query = from m in IM.GetMaster() 

      join co in CM.GetConsumers() 
      on m.InvoiceId equals co.InvoiceId into temp2 
      from co in temp2.DefaultIfEmpty() 

      join ch in CCM.GetCharge() 
      on new { co.InvoiceId, co.ConsumerId, } equals new { ch.InvoiceId, ch.ConsumerId } into temp 
      from ch in temp.DefaultIfEmpty() 

      orderby m.InvoiceId 
      select new 
      { 
       InvioceID = m.InvoiceId, 
       ConsumerID = co == null ? 0 : co.ConsumerId, 
       ChargeID = ch == null ? 0 : ch.ChargeId, 
       Amount = ch == null ? 0 : ch.Amount 
      }; 

Ich erhalte

Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

bei Linie on new { co.InvoiceId, co.ConsumerId, }. Wenn ich into temp2 from co in temp2.DefaultIfEmpty() entferne, werden zwar Rechnungs-IDs angezeigt, für die jedoch keine Verbraucher-ID angezeigt wird. Wie mache ich einen richtigen linken Join wo 3 Tische beteiligt sind?

Antwort

3

die left join bedeutet, dass, wenn kein passender Datensatz in der zweiten Tabelle ist dann all diese Werte sind null (unterscheidet sich von einem normalen join, dass es nicht den Datensatz aus der linken Tabelle zurück) .Sie können die co equals haben null für diesen Datensatz so haben Sie es

Versuchen Sie, diese zu überprüfen:

var query = from m in IM.GetMaster() 

     join co in CM.GetConsumers() 
     on m.InvoiceId equals co.InvoiceId into temp2 
     from co in temp2.DefaultIfEmpty() 

     join ch in CCM.GetCharge() 
     on new { co?.InvoiceId, co?.ConsumerId, } equals new { ch?.InvoiceId, ch?.ConsumerId } into temp 
     from ch in temp.DefaultIfEmpty() 

     orderby m.InvoiceId 
     select new 
     { 
      InvioceID = m.InvoiceId, 
      ConsumerID = co?.ConsumerId, 
      ChargeID = ch?.ChargeId, 
      Amount = ch?.Amount 
     }; 

auch Verwendung von ?. in Ihrem select new

sehen
+0

@onedaywhen - Ich habe diese Klassen mit den angezeigten Eigenschaften erstellt. Aber ya .. vergaß zu addieren in der 'equals' die'? .' zu der 'ch' Seite - So bearbeitet :) –

+0

@Scar - hat es dein Problem gelöst? –

+0

Es funktioniert jetzt, danke! :) – Scar