2009-12-03 36 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

相关问题