2012-03-29 8 views
3

ich die folgenden Tabellen:Doing 2 Links schließt sich auf dem gleichen Tisch mit einem Anruf

Benutzer:

  • userId, userFirstName, userLastName.

holdBilling:

  • bEntityID, CarrierOID, PayerOID, holdTYPE, createUserID.

Träger:

  • carrierOID, carrierName.

Zahler:

  • payerOID, payerName.

Ich möchte den Code in einer neuen Einheit hat

holdBilling => new 
{ 
     FirstName, LastName, CarrierName, PayerName 
} 

Einer dieser Entitäten speichern entweder ein Zahler oder einen Trägerwert (kann nicht beides haben). Im Grunde möchte ich mit einem Anruf 2 linke Joins auf der gleichen Tabelle machen. Dies wäre die SQL-Abfrage, die für mich arbeiten würde.

SELECT TOP 1000 [ID] 
     ,[bEntityID] 
     ,c.carrierID 
     ,c.carrierName 
     ,p.payerID 
     ,p.payerName 
     ,[holdType] (this is "C" for carrier and "P" for payer) 
    FROM .[dbo].[holdBilling] hb 
    left join dbo.payer p on hb.payerID = p.payerID 
    left join dbo.carrier c on hb.carrierID = c.carrierID 
    where [bEntityID] = 378 

Die temporäre Lösung, die ich gefunden habe, ist eine Liste aller für alle Zahler

select new 
     { 
      Elem = hold, 
      FName = u.userFirstName, 
      LName = u.userLastName, 
      Carrier = "", 
      Payer = p.payerName 
     }).ToList(); 

und die Zusammenlegung der beiden

var listC = (from hold in holdBilling 
       join u in Users on hold.createUserID equals u.userID 
       join c in carrier.DefaultIfEmpty() on hold.carrierID equals c.carrierID 
          select new 
          { 
           Elem = hold, 
           FName = u.userFirstName, 
           LName = u.userLastName, 
           Carrier = c.carrierName, 
           Payer = "" 
          }).ToList(); 

und ein Carriers bekommen, ich bin da zuversichtlich muss eine Lösung für beides in einer Abfrage sein.

Antwort

1

So etwas wie dies vielleicht:

var listC = (
       from hb in holdBilling 
       from p in payer.Where(a=>a.payerID==hb.payerID).DefaultIfEmpty() 
       from c in carrier.Where(a=>a.carrierID=hb.carrierID).DefaultIfEmpty() 
       where hb.bEntityID==378 
       select new 
       { 
        hb.bEntityID, 
        c.carrierID, 
        c.carrierName, 
        p.payerID, 
        p.payerName, 
        holdType=(payer==null?"P":"C") 
       } 
       ).Take(1000) 
       .ToList(); 
+0

Obwohl alle Antworten geholfen, das war derjenige, der am nächsten an der tatsächlichen Lösung war: eine kleine Verbesserung du: (c! = null)? c.carrierName: "" wurde benötigt; nicht nur für das Feld c.carrierName. Danke für die schnellen Antworten –

+0

Kein Problem. Froh, dass ich Helfen kann :-) – Arion

1

Sie müssen DefaultIfEmpty verwenden, um eine links zu tun beitreten

var listC = (from hold in holdBilling 
       from u in Users.Where(x => hold.createUserID == x.userID).DefaultIfEmpty() 
       from c in carrier.Where(x => hold.carrierID == x.carrierID).DefaultIfEmpty() 
       select new 
       { 
       Elem = hold, 
       FName = u.userFirstName, 
       LName = u.userLastName, 
       Carrier = c.carrierName, 
       Payer = "" 
       }).ToList(); 
Verwandte Themen