2011-06-08 120 views
2

考虑以下几点:如何过滤一个基于另一个LINQ查询的结果?

DP_DatabaseTableAdapters.EmployeeTableAdapter employeetableAdapter = new DP_DatabaseTableAdapters.EmployeeTableAdapter(); 
    DP_Database.EmployeeDataTable employeeTable = employeetableAdapter.GetData(); 

    var leadEmployees = from e in employeeTable 
         where e.IsLead == true 
         select e; 

    DP_DatabaseTableAdapters.LaborTicketTableAdapter tableAdapter = new DP_DatabaseTableAdapters.LaborTicketTableAdapter(); 
    DP_Database.LaborTicketDataTable table = tableAdapter.GetDataByDate(date.ToString("MM/dd/yyyy")); 

    var totHours = from l in table 
        join e in leadEmployees on l.EmployeeID equals e.EmployeeID 
        group l by l.EmployeeID into g 
        orderby g.Key 
        select new 
        { 
         EmployeeID = g.Key, 
         HoursWorked = g.Sum(s => s.HoursWorked) 
        }; 

总工时正确筛选的基础谁拥有IsLead位设置为true人leadEmployee名单上的结果。

我想知道如何使用where子句做到这一点,我已经attempd使用leadEmployees.Contanis不过需要一个整体EmployeeRow ...

我怎么能添加什么看起来是一个组成部分IN子句到where过滤器来替换连接?

var totHours = from l in table 
        where ?????? 
        group l by l.EmployeeID into g 
        orderby g.Key 
        select new 
        { 
         EmployeeID = g.Key, 
         HoursWorked = g.Sum(s => s.HoursWorked) 
        }; 
+0

这样,这将您的where子句需要专门评价? – Firoso 2011-06-08 18:16:47

+0

与您的主要问题无关,但您可以简化收集领导雇员的行:var leadEmployees = employeeTable.Where(e => e.IsLead);' – 2011-06-08 19:25:17

回答

3

如果您选择整个员工角色,包含将只需要整个EmployeeRow。您可以:

leadEmployees.Select(e => e.id).contains 

OR

leadEmployees.Count(e => e.id == l.id) > 0 

双方将合作。 (对于语法准确性,有些匆忙缺乏考虑)。

1

这应该工作:

var leadEmployees = from e in employeeTable       
where e.IsLead == true       
select e.EmployeeID; 

var totHours = from l in table     
where leadEmployees.Contains(l.EmployeeID)    
group l by l.EmployeeID into g  
orderby g.Key 
select new 
{      
EmployeeID = g.Key, 
HoursWorked = g.Sum(s => s.HoursWorked) 
}; 
相关问题