2009-06-18 17 views
6

sto cercando di scrivere la dichiarazione LINQ che è equivalente a:LINQ Select Dichiarazioni - Dove Not In

select e.EmployeeID, EmployeeName = e.FirstName + ' ' + e.LastName 
from Employees e 
where e.EmployeeID not in 
(
    select EmployeeID from Managers 
) 

Credo di essere abbastanza vicino con il seguente:

from e in Employees 
where e.EmployeeID != // This is where I'm lost 
(
    from m in Managers select m.EmployeeID 
) 
select new 
{ 
    e.EmployeeID, 
    EmployeeName = e.FirstName + ' ' + e.LastName 
} 

Sto cercando di inserirlo in un Html.DropDownList.

risposta

7

Non sono esattamente sicuro di quello che la corretta notazione delle query di questo è, ma la seguente sintassi espansa otterrà il lavoro fatto

var result = Employees 
    .Where(e => !Managers.Where(m => m.EmployeeId == e.EmployeeId).Any()) 
    .Select(e => new { EmployeeId = e.EmployeeId, EmployeeName = e.FirstName + ' ' + e.LastName); 
+0

Anche se questo funziona sicuramente va notato che a seconda di come la query viene eseguito e (non) ottimizzato * potrebbe * hanno un terribile spettacolo. – em70

+0

@ emaster70, penso che il modo migliore per descriverlo è che ha prestazioni E * M nella notazione Big O. – JaredPar

4

Utilizzando Any:

from e in Employees 
where !Managers.Any(m => m.EmployeeID == e.EmployeeID) 
select new 
{ 
    e.EmployeeID, 
    EmployeeName = e.FirstName + ' ' + e.LastName 
} 

Oppure, usando un LEFT JOIN:

from e in Employees 
join m in Managers on e.EmployeeID equals m.EmployeeID into managerGroup 
from m in managerGroup.DefaultIfEmpty() 
where m == null 
select new 
{ 
    e.EmployeeID, 
    EmployeeName = e.FirstName + ' ' + e.LastName 
} 
3

è possibile ottenere il risultato desiderato con un fluid implementation of Linq.Except():

List<Employee> employees = new List<Employee> 
    { 
     new Employee { EmployeeID = 1, FirstName = "John", LastName = "Smith" }, 
     new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" }, 
     new Employee { EmployeeID = 3, FirstName = "Eddie", LastName = "Punchclock" } 
    }; 
List<Employee> managers = new List<Employee> 
    { 
     new Employee { EmployeeID = 2, FirstName = "Jane", LastName = "Doe" }, 
    }; 
var nonManagerEmployees = employees.Except(managers, x => x.EmployeeID) 
    .Select(x => new 
     { 
      x.EmployeeID, 
      EmployeeName = x.FirstName + " " + x.LastName 
     }); 

foreach(var entry in nonManagerEmployees) 
{ 
    Console.WriteLine(entry.EmployeeID+" "+entry.EmployeeName); 
} 

uscita:

1 John Smith 
3 Eddie Punchclock