2013-09-25 80 views
1

我有2个数据对象。员工和经理使用LINQ查找两个数据对象之间的差异

class Employee{ 
int EmpId; 
int EmpName } 

Class Manager{ 
int ManagerID; //is the empId of an employee who is Manager 
} 

我想EmpName的名单谁不是在单个语句中使用LINQ经理。

我尝试这样做:

var employeeIdsWhoAreNotManagers = EmployeeList.Select(x=>x.EmpId).Except(Managerlist.Select(x=>x.ManagerId)); 

但这返回我只EMPID。然后我再次写一个linq来获取EmpName。

UPDATE1:

empNamesList = EmployeeList.Where(x=>x.employeeIdsWhoAreNotManagers.Contains(x.empId)).Select(x=>x.empName); 

如何合并成一个单一的LINQ查询这直接导致了我的EmpName列表?

回答

6

如果是LINQ到对象,你可以使用扩展方法ExceptBy

public static IEnumerable<T1> ExceptBy<T1, T2, R>(
    this IEnumerable<T1> source, 
    IEnumerable<T2> other, 
    Func<T1,R> keySelector1, 
    Func<T2,R> keySelector2) 
{ 
    HashSet<R> set = new HashSet<R>(other.Select(x => keySelector2(x))); 

    return source.Where(item => set.Add(keySelector1(item))); 
} 

EmployeeList.ExceptBy(Managerlist, x=>x.EmpId , y=>y.ManagerId)); 
相关问题