LINQ2SQL не возвращает тот же результат, что и T-SQL ... - PullRequest
2 голосов
/ 03 декабря 2009

У меня есть следующие таблицы:

Paciente -> PacienteTag -> Tag

Типичное значение N: M между Paciente и Tag с промежуточной таблицей.

Я хочу узнать, сколько пациентов имеют каждый тег. Простой:

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 возвращает правильные значения.

Идеи

1 Ответ

3 голосов
/ 03 декабря 2009

Предполагая, что ваши отношения установлены правильно и есть ссылка на PacienteTags из тега под названием PacienteTags, должно работать следующее.

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

Я обнаружил, что необходимость присоединиться к LINQ к (что угодно) довольно редко ... просто используйте сгенерированные ссылки для получения данных в других таблицах (или объектах, если используете EF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...