这些有点奇怪,所以我会尝试用简单的英文对其进行解释。我有三张桌子。使用LINQ帮助选择与数组内所有元素匹配的所有元素
TBL_PROFILE
TBL_LANGUAGES
TBL_LANGUAGES_LINK
其中的关系是TBL_PROFILE - > TBL_LANGUAGE_LINK < - TBL_LANGUAGES
因此,如果一个人说3种语言,他们将有三个条目TBL_LANGUAGE_LINK。
基本上我传递了一个字符串数组的语言ID,我需要选择所有讲话的配置文件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_link秋季的所有元素在语言阵列中“
由于某些原因,我收到的结果是TBL_PROFILE中的每条记录,我都难以解释。
我已经把它贴在LINQ生成的SQL下面的附加信息(道歉,如果答案是显而易见的 - 我的SQL技能的arent最好)
{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])
)))
}
任何帮助或建议非常赞赏:)
非常感谢您的快速响应!这个答案的问题是,如果数组有(例如)德语,日语和法语ID和一个配置文件只会说德语,那么配置文件仍然会返回。不幸的是,我需要所有的语言匹配,这就是为什么我加入了p.TBL_LANGUAGES_LINK。所有部分:) – Chris 2010-10-20 12:34:07