2009-06-18 9 views
6

Estoy tratando de redactar la declaración de LINQ que es equivalente a:LINQ Sentencias Select - Donde no en

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

Creo que estoy bastante cerca de lo siguiente:

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 
} 

Estoy tratando de poner esto en Html.DropDownList.

Respuesta

7

No estoy exactamente seguro de lo que la notación de consulta adecuado para esto, pero la siguiente sintaxis expandida conseguirá el trabajo hecho

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

Mientras esto seguramente trabaja debe tenerse en cuenta que dependiendo de la forma en la consulta se ejecuta y (no) optimizado * podría * tener un desempeño terrible. – em70

+0

@ emaster70, creo que la mejor manera de describirlo es que tiene un rendimiento E * M en notación Big O. – JaredPar

4

Usando Any:

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

O, utilizando una combinación izquierda:

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

, usted puede obtener el resultado deseado 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); 
} 

de salida:

1 John Smith 
3 Eddie Punchclock