2016-07-15 39 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。不需要理解它,只要知道这是模式并且它被查询提供者所认可。 –