2009-04-15 25 views
12

Sono abbastanza nuovo per Linq To SQL ma sto cercando di eseguire quello che dovrebbe essere una query SQL abbastanza semplice e non riesco a capire come farlo funzionare in LINQ.Linq to SQL e Avere

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) 

solo cercando di ottenere tutti gli utenti che non dispongono di un territorio assegnato, l'unico modo per dire se hanno un territorio è quello di verificare la gerrund user_x_territory.

io sono in grado di ottenere tutti gli utenti fuori dal mio DB con questo:

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; 

Ma da lì non riesco a capire come aggiungere un gruppo da/dover perfezionare i risultati della ricerca a mostra solo utenti senza territori.

Grazie per qualsiasi aiuto.

risposta

13

propongo la seguente soluzione.

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

Impressionante! Grazie mille, non sapevo si potesse fare con LINQ. – Chelsea

+0

* rofl * Mi piace la tua risposta più della mia! +1 –

+1

LINQ può fare tutto ...: D –

1

Non so quanto sia efficiente questo è (sto cercando di indovinare non molto), ma si potrebbe provare qualcosa di simile:

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

edit: eh, indovinate qualcuno mi ha battuto ad esso :(

 
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 
}