2012-02-07 14 views
53

Jak mogę przekonwertować właściwie to SQL do LINQKonwersja SQL do Linq LEFT JOIN z zerową

select t1.ProgramID 
from Program t1 LEFT JOIN ProgramLocation t2 ON t1.ProgramID = t2.ProgramID 
where t2.ProgramID IS NULL 

I spróbować, ale to nie działa

var progy = (
      from u in db.ProgramLocations join b in db.Programs 
      on u.ProgramID equals b.ProgramID into yG 
      from y1 in yG.DefaultIfEmpty() 
      where u.ProgramID == null 
      where u.ProgramID == null 
      select u.ProgramID 
      ).ToList(); 

DZIĘKI

+1

Tried http://www.linqpad.net/? – Nauman

+0

spowoduje konwersję kodu SQL na LINQ –

Odpowiedz

80

Chcesz użyć .DefaultIfEmpty, zgodnie this question.

var query = from p in Programs 
      join pl in ProgramLocations 
       on p.ProgramID equals pl.ProgramID into pp 
      from pl in pp.DefaultIfEmpty() 
      where pl == null 
      select p; 

Oto pełny, przykład pracy z niektórych makiety obiektów danych:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace LinqTest 
{ 
    class LinqProgram 
    { 
     public class Program 
     { 
      public int ProgramID { get; set; } 
      public string ProgramName { get; set; } 
     } 

     public class ProgramLocation 
     { 
      public int ProgramLocationID { get; set; } 
      public int ProgramID { get; set; } 
      public string ProgramLocationName { get; set; } 
     } 

     public static List<Program> Programs = new List<Program>(); 
     public static List<ProgramLocation> ProgramLocations = new List<ProgramLocation>(); 

     static void Main(string[] args) 
     { 
      FillTestData(); 

      var query = from p in Programs 
         join pl in ProgramLocations 
          on p.ProgramID equals pl.ProgramID into pp 
         from pl in pp.DefaultIfEmpty() 
         where pl == null 
         select p; 

      foreach (var r in query) 
      { 
       Console.WriteLine("{0}: {1}", r.ProgramID, r.ProgramName); 
      } 

      Console.ReadLine(); 
     } 

     private static void FillTestData() 
     { 
      var p = new Program() 
      { 
       ProgramID = Programs.Count + 1, 
       ProgramName = "Scary Lesson" 
      }; 
      var pl = new ProgramLocation() 
      { 
       ProgramLocationID = ProgramLocations.Count + 1, 
       ProgramID = p.ProgramID, 
       ProgramLocationName = "Haunted House" 
      }; 
      Programs.Add(p); 
      ProgramLocations.Add(pl); 

      p = new Program() 
      { 
       ProgramID = Programs.Count + 1, 
       ProgramName = "Terrifying Teachings" 
      }; 

      pl = new ProgramLocation() 
      { 
       ProgramLocationID = ProgramLocations.Count + 1, 
       ProgramID = p.ProgramID, 
       ProgramLocationName = "Mystical Mansion" 
      }; 
      Programs.Add(p); 
      ProgramLocations.Add(pl); 

      p = new Program() 
      { 
       ProgramID = Programs.Count + 1, 
       ProgramName = "Unassociated Program" 
      }; 
      Programs.Add(p); 
     } 
    } 
} 
+0

Niezwykle pomocne dzięki –

2

Spróbuj

var progy = (
     from u in db.ProgramLocations join b in db.Programs 
     on u.ProgramID equals b.ProgramID into yG 
     from y1 in yG.DefaultIfEmpty() 
     where y1 == null 
     select u.ProgramID 
     ).ToList(); 

Możesz sprawdzić this post on MSDN.

Mam nadzieję, że to zadziała.

2

Czy możesz użyć zamiast tego zamiast?

var progy = (
    from u in db.ProgramLocations 
    select u.ProgramID 
).Except(from b in db.Programs select b.ProgramID); 
+1

Działa to tylko wtedy, gdy identyfikator programu był jedyną wartością, którą trzeba było pobrać. – devlord

0
SELECT pfa.PetID, pt.PetTypeDesc, pfa.petname, pf.PetOwner, pf.remarks, pat.AdoptedBy 
    FROM dbo.PetForAdoption pfa 
    JOIN dbo.PetAdoptionTran pat 
    ON pfa.PetID = pat.PetID 
    JOIN dbo.PetTypes pt 
    ON pfa.PetTypeID = pt.PetTypeID 
    JOIN dbo.PetProfile pf 
    ON pfa.PetID = pf.PetID 
    ORDER BY pt.PetTypeDesc 
+0

Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i/lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Przeczytaj ten [jak-odpowiedź] (http://stackoverflow.com/help/how-to-answer) w celu uzyskania wysokiej jakości odpowiedzi. – thewaywewere