Запрос Entity Framework для внутреннего соединения


что бы запрос для:

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

в entity framework?

вот что я написал:

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

но это неправильно. Может ли кто-нибудь указать мне путь?

3 52

3 ответа:

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

в случае, если кто-то заинтересован в синтаксисе метода, если у вас есть свойство навигации, это очень просто:

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

вы можете использовать свойство навигации, если оно доступно. Он создает внутреннее соединение в SQL.

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