Как выбрать, где не существует с помощью LINQ? - PullRequest
47 голосов
/ 27 января 2012

Я должен перечислить все данные " смены ", которые должны быть назначены для " сотрудника ", но данные смены не должны быть включены, если они уже существуют в данных сотрудника.Давайте посмотрим на образец изображения.

No filtering yet

Этот запрос решает проблему.Я нашел это здесь:
Блог Скотта

select * from shift where not exists 
(select 1 from employeeshift where shift.shiftid = employeeshift.shiftid
and employeeshift.empid = 57);  

Посмотрим результат:

Filtered

Теперь мой вопрос,как я могу сделать это в linQ?Я использую платформу сущностей.
Надеюсь, кто-нибудь может помочь.Большое спасибо !!!

Ответы [ 5 ]

83 голосов
/ 27 января 2012
from s in context.shift
where !context.employeeshift.Any(es=>(es.shiftid==s.shiftid)&&(es.empid==57))
select s;

Надеюсь, это поможет

23 голосов
/ 27 января 2012

Результат sql будет другим, но результат должен быть таким же:

var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any());
2 голосов
/ 27 января 2012

Прежде всего, предлагаю немного изменить ваш sql запрос:

 select * from shift 
 where shift.shiftid not in (select employeeshift.shiftid from employeeshift 
                             where employeeshift.empid = 57);

Этот запрос предоставляет те же функции. Если вы хотите получить тот же результат с LINQ, вы можете попробовать этот код:

//Variable dc has DataContext type here
//Here we get list of ShiftIDs from employeeshift table
List<int> empShiftIds = dc.employeeshift.Where(p => p.EmpID = 57).Select(s => s.ShiftID).ToList();

//Here we get the list of our shifts
List<shift> shifts = dc.shift.Where(p => !empShiftIds.Contains(p.ShiftId)).ToList();
0 голосов
/ 16 июля 2017
        Dim result2 = From s In mySession.Query(Of CSucursal)()
                      Where (From c In mySession.Query(Of CCiudad)()
                             From cs In mySession.Query(Of CCiudadSucursal)()
                             Where cs.id_ciudad Is c
                             Where cs.id_sucursal Is s
                             Where c.id = IdCiudad
                             Where s.accion <> "E" AndAlso s.accion <> Nothing
                             Where cs.accion <> "E" AndAlso cs.accion <> Nothing
                             Select c.descripcion).Single() Is Nothing
                      Where s.accion <> "E" AndAlso s.accion <> Nothing
                      Select s.id, s.Descripcion
0 голосов
/ 27 января 2012

Как насчет ..

var result = (from s in context.Shift join es in employeeshift on s.shiftid equals es.shiftid where es.empid == 57 select s)

Редактировать: Это даст вам смены, где есть связанная смена сотрудников (из-за объединения). Для «не существует» я бы сделал то, что @ArsenMkrt или @hyp предлагают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...