2011-06-09 64 views
2

假设我有一张公司表格,一张雇员表格,而雇员表格的公司表格中有一张FK列表。查询公司并退还相关员工非常容易。LINQ中的筛选器相关表格

var companies = from c in Companies 
       select c; 

通过添加where子句来过滤这些公司非常容易。但是,我如何过滤上述查询中返回的员工。例如,只包括那些雇员列在真实的雇员?

我想退回所有公司,只有当前雇用的员工。

+0

您提供的示例不返回相关员工。 – StriplingWarrior 2011-06-09 23:30:04

+0

@StriplingWarrior:怎么样?我的例子实际上是组成的,并不反映我真实的代码。但它会返回真实代码中的相关数据。 – 2011-06-10 03:38:02

+0

因为这不会明确加载公司的员工,所以在对此查询进行评估时,它不会将它们加载到内存中。如果你遍历'companies',然后访问他们的'Employees'属性,你会懒洋洋地在同一时间,这将耗费大量的数据库往返加载一个员工的每一批。 – StriplingWarrior 2011-06-10 04:09:18

回答

4

要检索利用它们的公司及其员工:

var companies = from c in Companies 
       select new 
       { 
        Company = c, 
        EmployedPersons = c.Employees.Where(e => e.Employed) 
       }; 

使用像这样:

foreach (var company in companies) 
{ 
    Console.WriteLine("{0}", company.Company); 
    foreach (var employee in company.EmployedPersons) 
    { 
     Console.WriteLine("{0}", employee); 
    } 
} 

另一种方法,根据您的意见,您需要到别处过滤此:

public void DisplayEmployedPersons(Company company) 
{ 
    foreach (var employee in company.Employees.Where(e => e.Employed)) 
    { 
     Console.WriteLine("{0}", employee); 
    } 
} 

最后,您可以修改为您的生成的部分类数据对象:

public partial class Customer 
{ 
    public IEnumerable<Employee> CurrentEmployees 
    { 
     get { return this.Employees.Where(e => e.Employed); 
    } 
} 
+0

谢谢,这很接近。但我不想过滤这些公司。只是员工。 – 2011-06-09 23:26:15

+0

就像加入公司和员工检索那些被雇用的人一样? – user7116 2011-06-09 23:27:25

+0

对不起,我没有完全遵循。我想退回所有公司,只包括那些受雇的相关员工。我对此很新,但我知道加入是为我自动完成的。我能否以某种方式将自动连接替换为自定义连接? – 2011-06-09 23:29:49

3

我不知道你想与员工做什么,但在这里是通过他们迭代的方式:

var companies = from c in Companies 
       where c.Employees.Any(e => e.Employed) 
       select c; 

foreach (var company in companies) { 
    foreach (var employee in company.Employees.Where(e => e.Employed)) { 
     // your employed employees are iterated here 
    } 
} 
+0

这不会很有效,因为'公司'不会有'员工'属性。 – StriplingWarrior 2011-06-09 23:32:04

+0

谢谢,修正中编辑。 – ChessWhiz 2011-06-09 23:33:42

2

使用查询语法:

var companies = from c in Companies 
       from e in c.Employees 
       where e.Employed 
       select c;