2014-05-08 90 views
0

我一直試圖執行一個左連接到LINQ實體類型的表達式,但是DefaultIfEmpty方法的工作方式與我的預期不同 - 它爲每個CounterNo返回一個空行,它沒有在閱讀表中匹配。DefaultIfEmpty返回空行

var leftjoin = from counter in database.Counters 
       join reading in database.Readings 
       on counter.CounterNo equals reading.CounterNo into gj 
       from x in gj.DefaultIfEmpty() 
       select x; 

這樣我不知道Counters表中的哪行沒有對應的行Readings表。

我該如何做這項工作?

回答

0

聽起來像你根本不想在from x in gj.DefaultIfEmpty()中添加,而是你想讓左表中的每個項目與組的項目匹配(該組可能有零個元素,這是你如何知道什麼時候沒有匹配的項目),這正是你刪除該行時得到的行爲。

+0

你是否建議我應該用ID在Counters表中對記錄進行分組?這沒有達到我想要的 - 查詢不會返回左側表中沒有左側表中相應值的行。 – thespeedkills

+0

@thespeedkills正如我所說,你所要做的就是刪除我引用的那一行。在完成之後,'gj'將成爲右表中與左表中當前行匹配的所有行的集合。如果沒有匹配的項目,該集合的大小爲零。如果有一個匹配項目,它將是第一個。如果有10個匹配項目,它將是10號。例如,如果您希望左側表中的所有行都不匹配右側,則可以添加「where!gj.Any()」。 – Servy

+0

哦,我對Linq有點新,並不知道這個結構是可行的。 但是讓我們假設我想知道右側表中相應行的最大值(例如,reading.Value)。恐怕用你建議的解決方案是無法實現的。 – thespeedkills