Entity Framework Query для внутреннего соединения
Каким будет запрос для:
select s.* from Service s
inner join ServiceAssignment sa on sa.ServiceId = s.Id
where sa.LocationId = 1
в структуре сущностей?
Вот что я написал:
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();
но это неправильно. Может ли кто-нибудь привести меня к пути?
Ответы
Ответ 1
from s in db.Services
join sa in db.ServiceAssignments on s.Id equals sa.ServiceId
where sa.LocationId == 1
select s
Где db
- ваш DbContext
. Сгенерированный запрос будет выглядеть (образец для 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
В случае, если кто-либо заинтересован в синтаксисе метода, если у вас есть свойство навигации, это легко:
db.Services.Where(s=>s.ServiceAssignment.LocationId == 1);
Если вы этого не сделаете, если нет некоторого переопределения Join()
, о котором я не знаю, я думаю, что это выглядит довольно грубым (и я являюсь чистым синтаксисом метода):
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);
Ответ 3
Вы можете использовать свойство навигации, если оно доступно. Он создает внутреннее соединение в SQL.
from s in db.Services
where s.ServiceAssignment.LocationId == 1
select s