2012-01-27 12 views
40

Tengo que enumerar todos los datos "shift" que se asignarán a un "employee" pero los datos de turno no se deben incluir si ya existen en los datos del empleado. Veamos la muestra de imagen.¿CÓMO SELECCIONAR DONDE NO EXISTE usando LINQ?

No filtering yet

Esta consulta resuelve el problema. He encontrado esta aquí:
Scott's Blog

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

Veamos el resultado:

Filtered

Ahora mi pregunta es, ¿cómo podría hacer esto en linQ? Estoy usando el marco de la entidad.
Espero que alguien pueda ayudar. ¡¡¡Muchas gracias!!!

+1

simplemente puede hacer una unión ... si el derecho del registro no existe, el registro se debe izquierdo no se incluirá –

+0

@AndreasNiedermair ¿Puedes hacer un ejemplo? He hecho muchas uniones pero no recibí la correcta. – fiberOptics

+0

posible duplicado de [LINQ - Donde no existe] (http://stackoverflow.com/questions/899090/linq-where-not-exists) –

Respuesta

70
from s in context.shift 
where !context.employeeshift.Any(es=>(es.shiftid==s.shiftid)&&(es.empid==57)) 
select s; 

Esperanza esto ayuda

+0

oops, sí, corregido, gracias @RuneFS –

+0

"&& es.empid = 57" debe estar dentro de "(es.shiftid == s.shiftid)". funciona, pero no devuelve datos completos, faltan algunos datos. – fiberOptics

21

La sql resultado será diferente, pero el resultado debe ser el mismo:

var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any()); 
+4

Siempre debe usar 'Any()' en lugar de 'Count()' para determinar si _are_ results ... – Nuffin

+4

debe uso! .Any() en lugar de contar. Si no hay ninguno, el rendimiento será el mismo, pero en todos los casos donde haya más de un elemento, cualquiera será más rápido ya que detiene la iteración después de que se encuentre el primer elemento. –

+0

Bastante bien, editado. – hyp

0

¿Qué tal ..

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

Editar: Esta voluntad darle turnos donde haya una rotación de empleados asociada (debido a la unión). Para el "no existe" yo haría lo @ArsenMkrt o @hyp sugieren

+0

Pierdes empid = 57 comprobando –

+0

Sí, ¡además me di cuenta de que no estoy respondiendo exactamente la pregunta correcta! –

+0

sí, porque el resultado debe ser el conjunto de resultados, está obteniendo el valor bool –

2

En primer lugar, sugiero que modificar un poco la consulta SQL:

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

Esta consulta proporciona misma funcionalidad. Si desea obtener el mismo resultado con LINQ, puede probar este código:

//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

La consulta SQL funciona perfectamente. Pero en linq, estoy bien con una sola consulta. ¡Gracias! – fiberOptics

-1
 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 
+1

Por favor, aclare lo que está haciendo con este código. –