2009-04-15 12 views
12

Soy bastante nuevo en Linq To SQL pero trato de ejecutar lo que debería ser una consulta SQL bastante simple y no puedo entender cómo hacer que funcione bien en LINQ.Linq a SQL y teniendo

SELECT  Users.Id, Users.Id AS Expr1, Users.FirstName, Users.LastName, 
User_x_Territory.UserID 
FROM   Users LEFT OUTER JOIN 
      User_x_Territory ON User_x_Territory.UserID = Users.Id 
GROUP BY Users.Id, Users.Id, Users.FirstName, Users.LastName, User_x_Territory.UserID 
HAVING  (COUNT(User_x_Territory.UserID) = 0) 

tratando de obtener todos los usuarios que no tienen un territorio asignado, la única manera de saber si tienen un territorio es comprobar la gerrund user_x_territory.

soy capaz de conseguir todos los usuarios de mi DB con esto:

var users = from u in db.Users 
      join uXt in db.User_x_Territories on u equals uXt.User into gerr 
      from users in gerr.DefaultIfEmpty() 
      select users; 

Pero de ahí no puedo encontrar la manera de añadir un grupo de/tener que filtrar los resultados de búsqueda mostrar solo usuarios sin territorios

Gracias por cualquier ayuda.

Respuesta

13

que sugieren la siguiente solución.

db.Users.Where(u => u.User_x_Territories.Count == 0) 
+0

impresionante! muchas gracias, yo no sabía que se podía hacer eso con LINQ. – Chelsea

+0

* rofl * ¡Me gusta más tu respuesta que la mía! +1 –

+1

LINQ puede hacer todo ...: D –

1

No sé qué tan eficiente es este (supongo que no muy), pero se puede intentar algo como esto:

var users = (from u in db.Users 
      join uXt in db.User_x_Territories on u equals uXt.User into gerr 
      from users in gerr.DefaultIfEmpty() 
      select u).Where(u => u.User_x_Territories.Count == 0); 
1

edición: je, supongo que alguien se me adelantó :(

 
from t in db.Users 
join t0 in db.User_x_Territory on new { UserID = t.Id } equals new { UserID = t0.UserID } into t0_join 
from t0 in t0_join.DefaultIfEmpty() 
group new {t, t0} by new { 
    t.Id, 
    Column1 = t.Id, 
    t.FirstName, 
    t.LastName, 
    t0.UserID 
} into g 
where g.Count() == 0 
select new { 
    Id = g.Key.Id, 
    Expr1 = g.Key.Id, 
    g.Key.FirstName, 
    g.Key.LastName, 
    UserID = g.Key.UserID 
}