开发者

LINQ2SQL Doesn’t return the same result as T-SQL…

I’ve the following tables:

Paciente -> PacienteTag -> Tag

The typical N:M between Paciente and Tag with an intermediary table.

I want to obtain how many patients have each tag. Simple:

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

The result is a simple table like this:

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

However when I created my LINQ2SQL(given my limited LINQ2SQL knowledge) version of that, the results came like:

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

Puzzled, but more or less understanding what LINQ was doing, I downloaded Linqer and told it to translate the SQL Expression for me.

It came up with this:

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()
}

Which is not far from my approach. But surprisingly, that also comes back with the same wrong results!

I can see where th开发者_开发百科e error “is” but I cannot come with an alternative.

WHat am I doing wrong?

NOTE: in the above example, the table PacienteTag has two records that associate Tag4 with two random patients, my T-SQL is returning the right values.

Ideas?


Assuming that your relationships are set up correctly and there is a reference to PacienteTags from Tag called PacienteTags, the following should work.

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

I've found that the need to join in LINQ to (anything) is pretty rare... just utilize the generated references to get at data in other tables (or entities if using EF).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜