2014-01-22 68 views
1

可以說我擁有表格InvoicesCustomers。所有的發票都應該有一個客戶,但並不是所有的都有。即使連接的行不存在,使JOIN查詢匹配

我想選擇所有發票並將它加入到客戶的問題是,如果發票沒有客戶那麼該發票將不會在結果中顯示。

我現在擁有的是:

var query = from inv in Db.Invoices       
      join cust in Db.Customers on inv.IdCustomer equals cust.Id 
      select new { Invoice=inv, Customer=cust }; 

該查詢的偉大工程,如果發票有一個客戶。 如何選擇一個空客戶,並在客戶沒有找到的情況下仍然可以讓我查詢所有發票?我希望查詢返回所有發票,如果客戶在那裏加入它,否則返回一個空客戶。

我知道我可以做2個嵌套for循環,但我不認爲這將是有效的,當處理更多的連接時,它會更糟糕。

回答

3

你需要做一個左連接

var query = from inv in Db.Invoices       
      from cust in Db.Customers.Where(x => inv.IdCustomer == x.Id).DefaultIfEmpty() 
      select new { Invoice = inv, Customer = cust }; 
1

正如@Magnus說,你需要左聯接。您可以使用join * in * on * equals * into模式與基於語法的查詢做到這一點:

var query = from inv in Db.Invoices       
      join c in Db.Customers on inv.IdCustomer equals c.Id into customers 
      from cust in customers.DefaultIfEmpty() 
      select new { Invoice = inv, Customer = cust }; 

它是在MSDN描述:

左外連接是一個連接中返回第一個集合中的每個元素,不管是否在第二集合中有任何相關元素。通過調用組連接結果的DefaultIfEmpty方法,可以使用LINQ執行左外連接。

How to: Perform Left Outer Joins (C# Programming Guide)