Почему ToLookup () зависит от параметров загрузки в Linq2Sql? - PullRequest
2 голосов
/ 12 ноября 2009

Допустим, у меня есть 3 таблицы Posts, PostTags и Tags, определяющие отношение «многие ко многим». Я хочу получить справочную таблицу, которая даст мне все сообщения, связанные с данным тегом, поэтому я использую следующий код:

return dataContext.PostTags.ToLookup(pt => pt.Tag, pt => pt.Post);

В модульном тесте все прошло нормально, но в реальном приложении это не сработало. Я обнаружил, что у меня были разные варианты загрузки между моим модульным тестом и моим приложением.

Когда dataContext.DeferredLoadingEnabled = true;, все в порядке и работает, как и ожидалось, но когда dataContext.DeferredLoadingEnabled = false; и у вас нет параметров загрузки от PostTags до Post и Tag, возвращенный поиск содержит один ключ ( null) с пустым массивом для значения. Сгенерированный SQL

SELECT [t0].[PostID], [t0].[TagID]
FROM [dbo].[PostTags] AS [t0]

Поэтому, когда он генерирует поиск, pt => pt.Post возвращает null, и то же самое относится и к тегам.

Почему провайдер Linq2SQL не может генерировать правильный SQL в этом случае?

Уточнение : Под правильным SQL - любой SQL, который будет возвращать правильные объекты Post и Tag и позволять правильно их группировать.

1 Ответ

1 голос
/ 12 ноября 2009

Я нашел способ заставить его работать независимо от значения свойства DeferredLoadingEnabled и любых параметров загрузки:

var lookup = (from pt in dataContext.PostTags
              select new {pt.Post, pt.Tag}).ToLookup(x => x.Tag, x => x.Post);
...