2016-07-15 29 views
1

我有兩個表,NAttrValues和NAttrTitles。 NAttrTitles有一個ID,它在NAttrValues表中由'TitleID'列引用。我試圖返回NAttrTitles中沒有任何關聯NAttrValues的元素,在EntityFramework中使用LINQ。如何在EntityFramework中進行正確的連接並僅返回空值?

該SQL查詢返回正是我想要的

SELECT * FROM NAttrValues nav RIGHT JOIN NAttrTitles nat ON nav.TitleID = nat.ID WHERE nav.TitleID IS NULL 

我如何寫這篇文章的EntityFramework?我嘗試了各種不同的.DefaultIfEmpty()用法,但它們最終都返回了錯誤的東西,或者什麼也沒有。

+0

搜索「linq right join」會在SO上找到幾個有關答案的問題。也許其中的一個可以提供幫助? – ChrisF

回答

1

右外連接與Left Outer Join相同,左右側互換。因此,與您的SQL查詢相同的LINQ To Entities是:

var query = 
    from nat in db.NAttrTitles 
    join nav in db.NAttrValues on nat.ID equals nav.TitleID into nat_nav 
    from nav in nat_nav.DefaultIfEmpty() 
    where nav == null 
    select nat; 
+0

就是這樣!這正是我想要達成的。你能解釋爲什麼我需要將連接存儲到nat_nav中,然後執行DefaultIfEmpty()嗎?這是我從來沒有明白的。 – RamblerToning

+1

因爲左外部連接沒有自然的LINQ操作符。從鏈接中可以看到,左外部連接的模式始終爲1,並且a.Key中的a從a中的a連接b到b中的b相同,在a_b.DefaultIfEmpty()'中將b.Key等同於b中的a_b。不需要理解它,只要知道這是模式並且它被查詢提供者所認可。 –