查询在两个表中包含所有请求记录的用户

bmh*_*old 7 c# entity-framework linq-to-sql

数据结构如下:

用户身份)

UserApp(user_id,app_id)

UserSkill(user_id,skill_id)

使用linq-to-sql或EF,我如何构建一个查询来优雅地返回拥有所有请求的应用程序和技能的用户?

此外,我如何调整查询以返回拥有至少一个所请求的应用程序或技能的任何用户?基本上是OR与AND(上图).

更新1:

所以我认为我们很接近.基本上我想只返回拥有所有请求的应用和技能的用户.如果我们有两个技能和应用程序的请求ID数组:

int[] requestedAppIDs // [1, 2, 3]
int[] requestedSkillIDs // [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我只想返回一个用户,如果他们有应用程序1,2,3和技能4,5,6.

var usersWithAllSelectedAppsAndSkills = 
    context.Users
    .GroupJoin(context.UserApp,
        k => k.id,
        k => k.user_id,
        (o, i) => new { User = o, UserApps = i })
    .GroupJoin(context.UserSkill,
        k => k.User.id,
        k => k.user_id,
        (o, i) => new { User = o.User, o.UserApps, UserSkills = i })
    .Where(w => !requestedAppIDs.Except(w.UserApps.Select(x => x.app_id).ToArray()).Any() && !requestedSkillIDs.Except(w.UserSkills.Select(x => x.skill_id).ToArray()).Any())
    .Select(s => s.User)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

显然,LINQ不知道如何在我的Where()到SQL中翻译UserSkills.Select().ToArray().我怎么能做到这一点?

其次,OR解决方案(用户拥有任何一个所请求的应用程序或技能).

小智 2

这是一种方法,我希望我的语法正确:)

   using (var context = new YourContext())
           {
              var usersWithAllSkills = context.User
                                 .Where(w => w.id == yourId)
                                 .Join(context.UserApp,
                                        k => k.id,
                                        k => k.user_id,
                                        (o,i) => o)
                                 .Join(context.UserSkill,
                                        k => k.id,
                                        k => k.user_id,
                                        (o,i) => o)
                                 .ToList();

         var usersWithAnySkill = context.User
                            .Where(w => w.id == yourId)
                            .GroupJoin(context.UserSkill,
                                        k => k.id,
                                        k => k.user_id,
                                        (o,i) => new { User = o, UserSkills = i })
                            .GroupJoin(context.UserApp,
                                        k => k.User.id,
                                        k => k.user_id,
                                        (o,i) => new { User = o.User, o.UserSkills ,UserApps = i  })
                            .Where(w => w.UserSkills != null || w.UserApps != null)
                            .Select(s => s.User)
                            .ToList();

       }
Run Code Online (Sandbox Code Playgroud)