2009-12-03 47 views
2

我有如下表:LINQ2SQL不返回相同的結果爲T-SQL ...

Paciente - > PacienteTag - >標籤

典型的N:Paciente和標籤之間米,中介表。

我想獲得每個標籤有多少患者。很簡單:

SELECT Tag.TagName, COUNT(PacienteTag.TagId) AS Totals FROM Tag 
LEFT JOIN PacienteTag ON Tag.TagId = PacienteTag.TagId 
GROUP BY Tag.TagName 
ORDER BY Tag.TagName 

結果是一個簡單的表是這樣的:

Tag1, 0 
Tag2, 0 
Tag3, 0 
Tag4, 2 
Tag5, 0 
Etc… 

然而,當我建立了我的LINQ2SQL(給我有限的LINQ2SQL知識)的那個版本,結果出來,如:

Tag1, 1 
Tag2, 1 
Tag3, 1 
Tag4, 2 
Tag5, 1 
Etc… 

困惑,但或多或​​少了解LINQ在幹什麼,我下載了Linqer並告訴它爲我轉換SQL表達式。

它想出了這一點:

from t in db.Tag 
join t0 in db.PacienteTag on t.TagId equals t0.TagId into t0_join 
from t0 in t0_join.DefaultIfEmpty() 
group t by new { 
    t.TagName 
} into g 
orderby 
    g.Key.TagName 
select new { 
    g.Key.TagName, 
    Totals = (Int64?)g.Count() 
} 

這是不是從我的做法。但令人驚訝的是,這也帶來了相同的錯誤結果!

我可以看到錯誤「是」在哪裏,但我不能與替代方案來。

我在做什麼錯?

注意:在上面的示例中,PacienteTag表有兩個將Tag4與兩個隨機患者相關聯的記錄,我的T-SQL正在返回正確的值。

想法?

回答

3

假設您的關係設置正確,並且存在對來自標籤PacienteTags的PacienteTags的引用,以下內容應該可以工作。

from t in db.Tag orderby t.TagName 
select new { t.TagName, Totals = g.PacienteTags.Count() }; 

我發現,需要在LINQ加盟(任何)是非常罕見的...只是利用產生的引用(如果使用EF或實體)在其他表中的數據得到的。

+0

THanks,這個技巧,我不得不使用:「orderby t.TagName」 – 2009-12-03 15:31:00

+0

對不起。更正了代碼。我習慣於從EF中執行ObjectQuery語法。 – mkedobbs 2009-12-03 15:53:45

相關問題