2013-04-15 34 views
44

Điều gì sẽ là truy vấn cho:Entity Framework Query cho bên tham gia

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

trong khuôn khổ tổ chức?

Đây là những gì tôi đã viết:

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(); 

nhưng đó là sai. Có thể một số hướng dẫn tôi đến con đường?

+0

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

+1

Bạn đang sử dụng bài tập '=' thay vì so sánh '==' trong mệnh đề 'where'. Ngoài ra bạn không cần điều đó nếu bạn đã tham gia vào các lĩnh vực đó. –

+2

Không phải là 'nơi sl.id = s.id' thừa với điều kiện tham gia của bạn? –

Trả lời

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

Nơi dbDbContext của bạn. Truy vấn được tạo sẽ trông giống như (mẫu cho 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

Đó không phải là một bên ngoài tham gia bên ngoài? –

+3

@JonathanWood Không, đó là sự tham gia bên trong. Tham gia bên ngoài bên trái sẽ được tạo bởi nhóm tham gia. –

+0

Chúng ta có thể sử dụng từ s trong db.Services tham gia sa trong db.ServiceAssignments trên s.Id bằng sa.ServiceId ** || s.Id bằng null ** trong đó sa.LocationId == 1 chọn s –

4

Bạn có thể sử dụng thuộc tính điều hướng nếu có. Nó tạo ra một tham gia bên trong trong SQL.

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

Trong trường hợp bất cứ ai hứng thú với cú pháp Phương pháp, nếu bạn có một tài sản chuyển hướng, đó là cách dễ dàng:

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

Nếu không, trừ khi có một số Join() override Tôi không biết gì về , tôi nghĩ rằng nó trông khá gnarly (và tôi là một cú pháp purist Method):

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

Điều này sẽ không hoạt động nếu FK đến ServiceAssignment xảy ra là nullable , phải không? – Cardin

+3

@Cardin trong trường hợp đó tôi sẽ đề nghị C# 6? nhà điều hành. Nếu bạn không có, chỉ cần kiểm tra null trước khi sử dụng thuộc tính navigation. Nói chung, bạn không thêm một loạt các mã phòng thủ trong các ví dụ, để không nhầm lẫn giữa các điểm chính. Nếu FK là nullable, nó sẽ trông như thế này: (C# 6) 'db.Services.Where (s => s? .ServiceAssignment.LocationId == 1);' hoặc như thế này trong C# 5: 'db.Services.Where (s => s.ServiceAssignment! = null && s.ServiceAssignment.LocationId == 1);' –

+0

@ MichaelBlackburnĐó là sự thật! Nó dễ hiểu hơn. Cảm ơn bạn đã làm rõ. :) – Cardin

Các vấn đề liên quan