2013-04-15 9 views
44

Jaki byłby kwerendy dla:Entity Framework Query dla sprzężenia wewnętrznego

select s.* from Service s 
inner join ServiceAssignment sa on sa.ServiceId = s.Id 
where sa.LocationId = 1 

w Entity Framework?

To co napisałem:

var serv = (from s in db.Services 
       join sl in Location on s.id equals sl.id 
       where sl.id = s.id 
       select s).ToList(); 

ale to jest złe. Czy ktoś może mnie poprowadzić na ścieżkę?

+0

Spójrz tam: http : //stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql –

+1

Używasz przypisania '=' zamiast porównania '==' in klauzula "where". Również nie potrzebujesz tego, jeśli już dołączyłeś do tych pól. –

+2

Nie jest "gdzie sl.id = s.id" nadmiarowy z warunkiem łączenia? –

Odpowiedz

71
from s in db.Services 
join sa in db.ServiceAssignments on s.Id equals sa.ServiceId 
where sa.LocationId == 1 
select s 

Gdzie db to Twoja DbContext. Wygenerowane zapytanie będzie wyglądać (przykład dla EF6):

SELECT [Extent1].[Id] AS [Id] 
     -- other fields from Services table 
FROM [dbo].[Services] AS [Extent1] 
INNER JOIN [dbo].[ServiceAssignments] AS [Extent2] 
    ON [Extent1].[Id] = [Extent2].[ServiceId] 
WHERE [Extent2].[LocationId] = 1 
+2

Czy to nie jest lewe sprzężenie zewnętrzne? –

+3

@JonathanWood Nie, to połączenie wewnętrzne. Lewe sprzężenie zewnętrzne zostanie wygenerowane przez sprzężenie grupowe. –

+0

Czy możemy użyć z bazy danych w usłudze db.Services dołączyć sa w db.ServiceAssignments na s.Id jest równy sa.ServiceId ** || s.Id jest równe null ** gdzie sa.LocationId == 1 wybierz s –

4

Możesz użyć właściwości nawigacji, jeśli jest dostępna. Tworzy wewnętrzne sprzężenie w SQL.

from s in db.Services 
where s.ServiceAssignment.LocationId == 1 
select s 
34

W przypadku gdy ktoś jest zainteresowany w składni Method, jeśli mają właściwość nawigacji, to jest droga prosta:

db.Services.Where(s=>s.ServiceAssignment.LocationId == 1); 

Jeśli nie, chyba że istnieje jakiś Join() przesłanianie jestem nieświadomy myślę, że wygląda dość gnarly (a ja jestem składnia metody purist):

db.Services.Join(db.ServiceAssignments, 
    s => s.Id, 
    sa => sa.ServiceId, 
    (s, sa) => new {service = s, asgnmt = sa}) 
.Where(ssa => ssa.asgnmt.LocationId == 1) 
.Select(ssa => ssa.service); 
+0

Nie działałoby, gdyby FK do ServiceAssignment stało się zerowalne , prawda? – Cardin

+3

@Cardin w takim przypadku proponuję C# 6 ?. operator. Jeśli go nie masz, po prostu sprawdź zerowy przed użyciem właściwości nawigacji. Ogólnie rzecz biorąc, nie dodajesz paczki kodu obronnego w przykładach, aby nie pomylić głównego punktu. Jeśli FK jest zerowalne, wyglądałoby to tak: (C# 6) 'db.Services.Where (s => s? .ServiceAssignment.LocationId == 1);' lub jak to w C# 5: 'db.Services.Where (s => s.ServiceAssignment! = null && sServiceAssignment.LocationId == 1);' –

+0

@ MichaelBlackburnTo prawda! Jest to bardziej zrozumiałe. Dziękuję za wyjaśnienie. :) – Cardin

Powiązane problemy