2015-04-26 3 views
1

У меня есть этот запрос в SQL, но я не знаю, как я могу сделать это в Linqзапросов Linq к Sql Entity Framework C#

Это запрос

SELECT 
    GroupName, GroupsId 
FROM 
    Groups 
WHERE 
    GroupsId NOT IN (SELECT Groups.GroupsId 
        FROM AssignGroups 
        JOIN Groups ON AssignGroups.GroupsId = Groups.GroupsID 
           AND AssignGroups.UsersId = 1) 
ORDER BY 
    GroupName 

Я использую EF.

ответ

0

1) Вы можете оптимизировать запрос:

SELECT 
    g.GroupName 
, g.GroupsId 
FROM Groups g 
LEFT JOIN AssignGroups ag 
     ON g.GroupsId = ag.GroupsId 
     AND ag.UsersId = 1 
WHERE ag.GroupsId IS NULL 
ORDER BY g.GroupName 

2) Ваш Linq запрос:

from g in context.Groups 
join ag in context.AssignGroups 
on new {g.GroupsId, UsersId = 1} equals new {ag.GroupsId, ag.UsersId} into ags 
from ag in ags.DefaultIfEmpty() 
where ag.GroupsId == null 
orderby g.GroupName 
select new {g.GroupName, g.GroupsId} 
2
var result = from group in Groups 
      let validGroups = from aGroup in AssignGroups 
           from vGroup in Groups 
           where aGroup.GroupsId == vGroup.GroupsID && 
           vGroup.UserId == 1 
           select vGroup.GroupsID 
      where validGroups.Contains(group.GroupID) 
      orderby group.GroupName 
      select group; 

Ключевым моментом здесь является «пусть» clausule, который создает подзапрос, что это IQueryable < T>, поэтому он может быть использован с «Содержит» clausule (который, в конце концов, будут переведены к " IN() "clausule).

+0

Было бы хорошо, если бы вы добавили пояснения к нему. –

Смежные вопросы