2016-06-23 107 views
1

你好,我困在一個問題上,希望有人能解釋我的答案!linq查詢實體框架如何連接表?導航屬性?

所以在我的數據庫中,我有3個表連接像這樣:

Customer   CustomerAddress  Address 
-CustomerID  -CustomerID   -AddressID 
-FirstName  -AddressID    -Street 
-LastName        -City 

所以我創造我的實體模型和中間表(CustomerAddress)被移除,並通過導航屬性所取代?

所以我想要做的是在C#中使用LINQ查詢連接表。 在SQL查詢會是這個樣子:

Select * 
From dbo.customer as c 
left join dbo.customeraddress as ca on c.customerID = ca.customerID 
left Join dbo.Address as a on a.addressID = ca.addressID 

我在這裏認識那不是如此,因爲沒有customeraddress表。我是否使用導航屬性列來進行連接?在我的模型圖中,我注意到在Customer類/表中有一個名爲Addresses的導航屬性,似乎映射到名爲Customers的Address類/表屬性。

所以我已經試過這樣:

var customerQuery = (from customer in db.Customers 
        join address in db.Addresses on customer.Addresses equals address.Customers into add 
        from rt2 in add.DefaultIfEmpty() 
        select new { //.. }); 

但是,這顯然是不正確,因爲我不能確定做什麼用的導航性能做加入他們的行列。我真的很感激,如果有人能向我解釋我如何去加入這個模型!

+0

爲什麼不使用em表呢?雖然只是要清楚你想加入時間,所以你可以從連接表中選擇? – Niklas

回答

1

當你有導航屬性時,你只需在你的查詢中使用它們,如果它們是對象就會做什麼 - 不需要使用連接,EF會爲你生成它們。

例如,您的查詢會是這樣:

var customerQuery = (from customer in db.Customers 
        from address in customer.Addresses.DefaultIfEmpty() 
        select new { //.. }); 

,這將產生left outer join爲您服務。如果你想inner join,刪除DefaultIfEmpty()

+1

非常感謝你,這正是我想要的! – 7q9l4n1d

+0

如果客戶和地址之間的關係是1:1會怎麼樣?那麼DefaultIfEmpty方法不可用。 –

+0

我想我想通了。它看起來像'db.Customers.Where(c => c.Address).DefaultIfEmpty();' –