2010-12-21 25 views
20

Potrzebuję pomocy,LINQ Lewy JOIN i RIGHT JOIN

Mam dwa dataTable nazywa A i B, muszę wszystkie wiersze z i pasujący wiersz B

Ex:

A:           B: 

User | age| Data       ID | age|Growth         
1 |2 |43.5        1 |2 |46.5 
2 |3 |44.5        1 |5 |49.5 
3 |4 |45.6        1 |6 |48.5 

muszę obecnie wprowadzone:

User | age| Data |Growth 
------------------------       
1 |2 |43.5 |46.5       
2 |3 |44.5 |       
3 |4 |45.6 | 

Odpowiedz

26

przykładowe dane i wyjście podasz nie wykazywać LEFT JOIN. Jeśli to była lewa dołączyć swoją moc będzie wyglądać następująco (zauważ jak mamy 3 wyników dla użytkownika 1, czyli raz dla każdego rekordu Wzrostu że użytkownik 1 ma):

User | age| Data |Growth 
------------------------       
1 |2 |43.5 |46.5       
1 |2 |43.5 |49.5  
1 |2 |43.5 |48.5  
2 |3 |44.5 |       
3 |4 |45.6 | 

Zakładając, że nadal wymagają LEFT JOIN ; Oto jak to zrobić LEFT JOIN w Linq:

var results = from data in userData 
       join growth in userGrowth 
       on data.User equals growth.User into joined 
       from j in joined.DefaultIfEmpty() 
       select new 
       { 
        UserData = data, 
        UserGrowth = j 
       }; 

Jeśli chcesz zrobić prawo przyłączyć, wystarczy zamienić tabele że jesteś wybranie znad, tak:

var results = from growth in userGrowth 
       join data in userData 
       on growth.User equals data.User into joined 
       from j in joined.DefaultIfEmpty() 
       select new 
       { 
        UserData = j, 
        UserGrowth = growth 
       }; 

Ważną częścią kodu jest instrukcja, po której następuje DefaultIfEmpty. To mówi Linq, że chcemy mieć wartość domyślną (np. Null), jeśli nie ma pasującego wyniku w drugiej tabeli.

4

Lekarz Jones pokazał lewe sprzężenie zewnętrzne, ale prawidłowa odpowiedź byłaby nieco inna - ponieważ w oryginalnym pytaniu dwie tabele powiązane w polu wieku, aby uzyskać wynik dokładnie taki, jaki jest potrzebny, należy użyć następującego kodu.

.... 
//ctx = dataContext class - not shown here. 
var user1 = new UserData() { User = 1, Age = 2, Data = 43.5 }; 
var user2 = new UserData() { User = 2, Age = 3, Data = 44.5 }; 
var user3 = new UserData() { User = 3, Age = 4, Data = 45.6 }; 

ctx.UserData.AddRange(new List<UserData> { user1, user2, user3 }); 

var growth1 = new UserGrowth() { Id = 1, Age = 2, Growth = 46.5 }; 
var growth2 = new UserGrowth() { Id = 1, Age = 5, Growth = 49.5 }; 
var growth3 = new UserGrowth() { Id = 1, Age = 6, Growth = 48.5 }; 

ctx.UserGrowth.AddRange(new List<UserGrowth> { growth1, growth2, growth3 }); 

var query = from userData in ctx.UserData 
         join userGrowth in ctx.UserGrowth on userData.Age equals userGrowth.Age 
          into joinGroup 
         from gr in joinGroup.DefaultIfEmpty() 
         select new 
         { 
          User = userData.User, 
          age = userData.Age, 
          Data = (double?)userData.Data, 
          Growth = (double?)gr.Growth 
         }; 

Console.WriteLine("{0} | {1} | {2} | {3}", "User", "age", "Data", "Growth"); 
      foreach (var x in query) 
      { 
       Console.WriteLine("{0} | {1} | {2} | {3}", x.User, x.age, x.Data, x.Growth); 
      } 


.... with following entity classes: 

public class UserData 
    { 
     [Key] 
     public int User { get; set; } 
     public int Age { get; set; } 
     public double Data { get; set; } 
    } 

    public class UserGrowth 
    { 
     public int Id { get; set; } 
     public int Age { get; set; } 
     public double Growth { get; set; } 
    }