2016-04-11 4 views
1

Ich versuche, eine Sql-Abfrage zu einem C# LINQ Join zu übernehmen. Ich habe es versucht, aber das konnte ich nicht erreichen. Diese entsprechende Abfrage in SQL arbeitet, wie sie ist:Wie wird eine bedingte Verknüpfung in Sql mit Linq in C# durchgeführt?

SELECT pj01.CLID from us20 
INNER JOIN pj01 ON pj01.PJID = 
( 
    CASE 
    WHEN (us20.BKNM = 'PJID') 

    THEN us20.BKID 

    WHEN (us20.BKNM = 'PSID') 

    THEN 
    (
     SELECT PJID FROM pj02 WHERE CLID = us20.CLID AND PSID = us20.BKID 
    ) 
    END 
) 

Mein Linq Versuch, der nicht funktioniert - Daten nicht kommen:

var result = 
     from us20 in Us20Repository.GetAll() 
     join pj01 in Pj01Repository.GetAll() on new 
     { 
      PJID = 
      (us20.BKNM == "PJID" ? 
        us20.BKID : 
        (
         us20.BKNM == "PSID" ? 
         (
         (from pj02 in Pj02Repository.GetAll() 
         where 
           pj02.CLID == us20.CLID && 
           pj02.PSID == us20.BKID 
         select new 
         { 
           PJID = pj02.PJID 
         }).First().PJID 
        ) : 
         "" 
        ) 
      ) 
     } equals new { PJID = pj01.PJID } 
     select new 
     { 
      CLID = pj01.CLID 
     }; 

Wie kann ich das tun? Ist das möglich?

+0

Sobald die Abfrage generiert wurde, können Sie den Mauszeiger über 'result' bewegen und uns die SQL-Anweisung zeigen, die generiert wird? – Rob

+0

23.000 Zeilendaten (Daten = "100") in SQL-Abfragen, Linq: 0 –

+0

Ich meinte das Ergebnis * vor * es wurde materialisiert. Es sollte Ihnen die SQL zeigen (rufen Sie 'ToList()' oder eine andere Materialisierungsmethode nicht auf). Lasse es als "IQueryable" und inspiziere es. – Rob

Antwort

0

Dies ist eine Beispielsyntax. Hope this

dbContext.SourceTable   // source 
         .Join(dbContext.TargetTable,   // target 
             source=> source.Id,   // FK 
             target=> target.Id, // PK 
             (source, target) => new { source= source,target=target}).Where(x=>x.source.somefield!=x.target.somefield) // project result 
            .Select(x => x.source); //the output 
+1

Ich denke, das OP weiß, wie man eine regelmäßige Join tun. Nur in diesem Fall ist die Verknüpfung komplizierter als die Angabe eines Schlüssels. – Rob

+0

Ich sagte Ihnen gerade Linq –

0

Anonyme Typen unterstützen standardmäßig keine kluge Equals Implementierung helfen, sondern einfach Object.Equals verwenden, weshalb es Sinn für mich völlig macht, dass die Abfrage kein Ergebnis zurückgibt. Dies wäre völlig in Ordnung, wenn Ihr LINQ-Provider Ihre Abfrage nicht nach SQL übersetzt, sondern den Join lokal ausführt. Versuchen Sie, den anonymen Typ im Join-Operator wegzulassen:

var result = 
    from us20 in Us20Repository.GetAll() 
    join pj01 in Pj01Repository.GetAll() on 
     (us20.BKNM == "PJID" ? 
       us20.BKID : 
       (
        us20.BKNM == "PSID" ? 
        (
        (from pj02 in Pj02Repository.GetAll() 
        where 
          pj02.CLID == us20.CLID && 
          pj02.PSID == us20.BKID 
        select new 
        { 
          PJID = pj02.PJID 
        }).First().PJID 
       ) : 
        "" 
       ) 
     ) 
    equals pj01.PJID 
    select new 
    { 
     CLID = pj01.CLID 
    }; 
+0

leider nicht –

Verwandte Themen