2010-04-06 9 views
10

¡Mi cerebro parece estar lleno ahora! Estoy usando LINQ to Entity, y necesito obtener algunos datos de una tabla que NO existe en otra tabla.LINQ to Entity, uniéndose a las tablas NOT IN

Por ejemplo: Necesito groupID, groupname y groupnumber de TABLE A donde no existen en TABLE B. El groupID existirá en TABLE B, junto con otra información relevante. Las tablas no tienen ninguna relación. En SQL sería simplemente (no es una solución más elegante y eficaz, pero quiero pintar un cuadro de lo que necesito)

SELECT 
    GroupID, 
    GroupName, 
    GroupNumber, 
FROM 
    TableA 
WHERE 
    GroupID NOT IN (SELECT GroupID FROM TableB) 

¿Hay una manera fácil/elegante de hacer esto utilizando el marco de la entidad/LINQ a la entidad? Ahora tengo un montón de consultas que llegan al db, luego comparo, etc. Es bastante complicado.

Respuesta

14

usted podría utilizar cualquier @Nix

var temp =context.TableA 
     .Where(x=>!context.TableB.Any(y=>y.GroupID!=x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 
+0

¿Debería la cláusula interna ser 'y => y.GroupID == x.GroupID'? (devuelve falso si hay elementos en 'TableB' con este' GroupID') – Hannele

+0

@Hannele Técnicamente es el mismo, y probablemente más legible. Por alguna razón, fui creado para hacer una lógica booleana al revés. – Nix

+0

Estoy de acuerdo con Hannele, creo que debería ser Where (x =>! Context.TableB.Any (y => y.GroupID == x.GroupID)) – Sam

4

depende de cómo los has conocido, que no se presenta, pero, en general:

var q = from a in Context.TableA 
     where !a.Group.TableBs.Any() 
     select new 
     { 
      GroupID = a.GroupID, 
      GroupName = a.GroupName, 
      GroupNumber = a.GroupNumber 
     }; 
1

- Su conjunto de resultados debe han sido o bien:

var temp =context.TableA 
     .Where(x=>context.TableB.Any(y=>y.GroupID != x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

O

var temp =context.TableA 
     .Where(x=> ! context.TableB.Any(y=>y.GroupID == x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

Pero NO ambos, como usted lo escribió.

Cuestiones relacionadas