2011-06-09 87 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;