Допустим, у меня есть 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 и позволять правильно их группировать.