2009-06-18 16 views
6

Próbuję napisać oświadczenie LINQ, który jest równoważny:LINQ SELECT - Gdzie Not In

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

myślę, że jestem bardzo blisko z następujących czynności:

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 
} 

Próbuję umieścić to w Html.DropDownList.

Odpowiedz

7

Nie jestem do końca pewien, co właściwe oznaczenie zapytanie o to, ale po składnia rozszerzony będzie to zadanie

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

Chociaż na pewno działa należy zauważyć, że w zależności od tego, jak zapytanie zostanie wykonany i (nie) jest zoptymalizowany * siła * mają straszną osiągi. – em70

+0

@ emaster70, myślę, że najlepszym sposobem na opisanie tego jest to, że ma on wydajność E * M w notacji Big O. – JaredPar

4

Korzystanie Any:

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

Albo, używając 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

można uzyskać wynik, który chcesz z 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); 
} 

wyjściowa:

1 John Smith 
3 Eddie Punchclock