Это немного странно, поэтому я сначала попытаюсь объяснить это простым языком. У меня есть три стола.
TBL_PROFILE
TBL_LANGUAGES
TBL_LANGUAGES_LINK
где отношение TBL_PROFILE -> TBL_LANGUAGE_LINK <- TBL_LANGUAGES </p>
поэтому, если человек говорит на 3 языках, у него будет три записи в TBL_LANGUAGE_LINK.
Обычно я передаю строковый массив идентификаторов языков, и мне нужно выбрать все профили, которые говорят на ALL языках в этом массиве, а не только один из них.
Вот что я придумала
from p in db.TBL_PROFILEs
where p.ACTIVE == true
&& p.TBL_LANGUAGES_LINKs.All(x => languages.Contains(x.LANGUAGE_ID.ToString())) == true
select p;
(FYI 'languages' - это массив строк)
Мне кажется, это логично: s "Выбрать все профили, в которых все элементы в languages_link входят в массив языков"
По какой-то причине я получаю все записи в TBL_PROFILE, которые мне сложно объяснить.
Я приложил сгенерированный LINQ SQL ниже для дополнительной информации (извиняюсь, если ответ очевиден - мои навыки SQL не самые лучшие)
{SELECT [t0].[PROFILE_ID], [t0].[USER_ID].........
FROM [dbo].[TBL_PROFILE] AS [t0]
WHERE ([t0].[ACTIVE] = 1) AND (NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[TBL_LANGUAGES_LINK] AS [t1]
WHERE ((
(CASE
WHEN (CONVERT(NVarChar,[t1].[LANGUAGE_ID])) IN (@p0, @p1) THEN 1
ELSE 0
END)) = 0) AND ([t1].[PROFILE_ID] = [t0].[PROFILE_ID])
)))
}
Любая помощь или совет с благодарностью:)