2009-08-13 12 views
5

Mam 2 tabele, które mają stosunek do siebie do siebie.Jak to zrobić w Entity Framework (multiple where's or Join)?

Tabela A zawiera od 1 do wielu relacji z tabelą B, więc tworzy właściwość nawigacji w każdym z nich.

Teraz muszę sprawdzić wartość z tabeli A (userName) i muszę sprawdzić wartość z tabeli B (ClubId).

Więc w moim umyśle, to byłoby coś

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

ale teraz wiem z Entity rzeczy należy zrobić dołącza rzadsze więc zastanawiam się, czy mogę to zrobić ze sprzężenia wtedy.

Próbowałem to

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

tak to nie działa, ponieważ nie wróci odpowiedniego rodzaju (2-gi gdzie). Właśnie tak myślałem, jak będę się spodziewać, że to się uda.

Jak powinien wyglądać?

P.S

raczej mam przykład zrobić w metodzie zapytań LINQ jak ja powyżej.

Odpowiedz

4

Filtrowanie TableA przed swój przyłączenia jest prawdopodobnie bardziej efektywne:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

Nie trzeba użyć dwóch zmiennych, to tylko moje preferencje dla przejrzystości.

Albo w składni metody można uprościć bitowe:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

Jednak nie jestem pewien EF rozumie tych konkretnych wyrażeń. Jeśli nie, kompilator przetłumaczy powyższe zapytanie w ten sposób:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

Ah. Wow. Nie jestem pewien, co mi się bardziej podoba w jego przypadku. To selectMany mnie wyrzuca. Co się stanie, jeśli potrzebuję innego filtra? czy mogę dodać kolejną selectMany? Cóż, pierwsza składnia metody działa, nie wiem, czy działa wewnętrznie i robi drugą rzecz. Wszystkie zapytania miałyby ten sam czas wykonania. Co jest w drugim SelectMany one does. jak to jest = = a.TableB, (a, b) =>) zrobić? – chobo2

+0

Zaktualizowałem wpis z poprawką w tłumaczeniu zapytania. Pierwsza SelectMany w zasadzie "spłaszcza" zagnieżdżoną kolekcję, zwracając sekwencję wszystkich B z wszystkich liter A. Drugi SelectMany akceptuje dwóch delegatów, "collectSelector", aby pobrać kolekcję B z A i "resultSelector", aby określić zwracaną wartość dla A i B.LINQ po prostu wybiera oba obiekty wejściowe, do wykorzystania w dalszej części zapytania. – dahlbyk

5

Zakładając model EF relacji między użytkownikami i klubów mógłby zrobić coś takiego:

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

Jeśli chcesz powrócić elementy zarówno użytkowników i kluby spojrzeć na dołącza w zapytaniu.

+0

Spróbuję, ale jak mam to zrobić w zapytaniach metod Linq? – chobo2