2009-08-11 9 views
3

Ich mag würde mit LINQ eine Mitarbeiterliste zu erhalten, müssen diese Mitarbeiter die typeofWork bestand in der TypeOfWorks Liste haben (Id) in ArgumenteExists Abfrage mit LINQ

public class Employee 
    { 
     public virtual IList<EmployeeTypeOfWork> TypeOfWorks { get; set; } 
    } 

    public class EmployeeTypeOfWork 
    { 
     public virtual Guid Id { get; set; } 
     public virtual Employee Employee { get; set; } 
     public virtual TypeOfWork TypeOfWork { get; set; } 
    } 

    public class TypeOfWork 
    { 
     public virtual Guid Id { get; set; } 
    } 

    public IList<Employee> ListWithTypeOfWork(IList<Employee> Employees, 
Guid typeOfWorkId) 
    {  
     ?????  
    } 

ich das versucht, aber ich vermisste etwas, das ich denken

 var res = from p in Employees 
     where (from pp in p.TypeOfWorks 
    where pp.TypeOfWork.Id == guid select pp.Id).Contains(p.Id) 
     select p; 

Antwort

3
public IEnumerable<Employee> ListWithTypeOfWork(IList<Employee> Employees, Guid typeOfWorkId) 
{  
    return from emp in Employees 
     where emp.TypeOfWorks.Any(x => x != null && x.Id == typeOfWorkId) 
     select emp;   
} 
+0

Danke Blesh. Die Übereinstimmung 100% mit meiner Frage könnte Sie die WHERE-Klausel zu diesem korrigieren: where emp.TypeOfWorks.FirstOrDefault (x => x! = Null && x.TypeOfWork.Id == guid)! = Null –

+0

Nur für Informationen, wenn ich Fragen Sie Linq Code, warum jeder mit Lambda-Ausdruck antworten, gibt es einen bestimmten Grund? –

+0

@ Kris-l: FirstOrDefault (Func <>) und Any (Func <>) sind ziemlich genau die gleiche Methode aufrufen, können Sie in Reflector überprüfen. Der einzige Unterschied ist, dass FirstOrDefault (Func <>) ein Objekt zurückgibt, und Any (Func <>) gibt einfach ein Bool zurück. Wenn Sie nur eine Liste von Referenztypen testen, ist die Rückgabe des bool etwas effizienter. Wenn Sie eine Liste von Werttypen testen, ist das nicht unbedingt von Bedeutung, aber wahrscheinlich ist es noch ein wenig effizienter, ein Bool zurückzugeben. –

6

Versuchen Sie, die folgenden

var res = Employees 
    .Where(x => x.TypeOfWorks.Any(w => w.Id == guid)) 
+0

Warum ersetzen Sie das 'Where' nicht durch' Any', damit Sie es verkürzen können? :) –

+0

@Ryan, guten Ruf. Ich vergesse, dass es eine Überladung von Any gibt, die ein Prädikat akzeptiert. – JaredPar

+0

Wenn einer dieser TypeOfWorks ein NULL ist, wird der Code werfen und ausschließen. –