2010-10-20 29 views
0

这些有点奇怪,所以我会尝试用简单的英文对其进行解释。我有三张桌子。使用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]) 
    ))) 
} 

任何帮助或建议非常赞赏:)

回答

0

试试这个。

from p in db.TBL_PROFILEs       
where p.ACTIVE == true 
join l in db.TBL_Languages_Links on 
p.ProflieID equals l.ProflieID 
where languages.Contains(l=>l.Language_ID.ToString()) 
select p; 

的答案是基于很多关于表的外键和ü[R比较字符串到ID字段中的事实的假设。

+0

非常感谢您的快速响应!这个答案的问题是,如果数组有(例如)德语,日语和法语ID和一个配置文件只会说德语,那么配置文件仍然会返回。不幸的是,我需要所有的语言匹配,这就是为什么我加入了p.TBL_LANGUAGES_LINK。所有部分:) – Chris 2010-10-20 12:34:07

0

令人怀疑它是最有效的方法,但是它返回的语言在语言表中的语言与所提供的数组中的所有元素完全匹配。它也排除只符合最初目标的一些标准的要素。现在基本上我现在要从一整套配置文件开始,并在我去的时候去掉元素。

var query = from p in db.TBL_PROFILEs 
      where p.ACTIVE == true 
      select p; 


foreach (int language in languages) 
{ 
    query = query.Where(p => p.TBL_LANGUAGES_LINKs.Where(
               x => 
               x.LANGUAGE_ID == language) 
               .Count() == 1); 
} 

更好的方法来做到这一点仍将不胜感激!

0

我认为下面的查询会起作用。 你可以内部加入语言列表到语言表如下。 Linq让你做到这一点。请参阅:

int[] languages = // populate languages 
var query = from p in db.TBL_PROFILE 
      join link in db.TBL_Languages_Links on link.ProfileID equals p.ProfileID 
      join lang in db.TBL_LANGUAGES on link.LanguageID equals lang.LanguageID 
      join arrlang in languages on lang.LanguageName equals arrlang 
      where p.ACTIVE == true 
      select p;