C# 使用Linq查询选择属性的任何值与列表中的值匹配的对象

C# 使用Linq查询选择属性的任何值与列表中的值匹配的对象,c#,entity-framework,linq,C#,Entity Framework,Linq,因此,我试图通过当前登录用户的userID来过滤模块对象列表。之后,我尝试获取这些选定对象的moduleID 使用该选项,我想将报告列表筛选为仅包含与先前获得的moduleID列表匹配的moduleID的报告列表 我对Linq不是特别了解,这就是我想到的: var name = User.Identity.GetUserName(); //gets the currently logged in user: ApplicationUser currentU

因此,我试图通过当前登录用户的
userID
来过滤模块对象列表。之后,我尝试获取这些选定对象的
moduleID

使用该选项,我想将报告列表筛选为仅包含与先前获得的
moduleID
列表匹配的
moduleID
的报告列表

我对Linq不是特别了解,这就是我想到的:

    var name = User.Identity.GetUserName();
        //gets the currently logged in user:
        ApplicationUser currentUser = 
            (ApplicationUser)db.Users.Single(x => x.UserName == name); 
        //gets moduleID's for modules owned by current user:
        var modules = (from i in db.Modules
                       where i.User == currentUser
                       select i.ModuleID); 
        var Reports = from u in db.Reports
                      where u.moduleID == modules
                      select u;
我在最后一部分尝试将contains方法合并到语句中时遇到问题


任何帮助都将不胜感激。

您不能将
int
IEnumerable
进行比较。但是,您可以检查是否在
模块中找到
模块ID
,如下所示:

where modules.Contains(u.moduleID)

你在正确的轨道上

var Reports = from u in db.Reports
              where modules.Contains(u.moduleID)
              select u;
或使用lambda:

var reports = db.Reports.Where(u => modules.Contains(u));

如果我正确推断了您的表结构,您可以将多个查询简化为一个查询:

var name = User.Identity.GetUserName();
var reports = from r in db.Reports
              join m in db.Modules on r.moduleID equals m.ModuleID
              where m.User.UserName == name
              select r;

你很接近。在Linq中,它与标准SQL有点倒退。在本例中,您希望查看报表的模块id是否包含在模块列表中,因此如下所示:

  var Reports = from u in db.Reports
                where modules.Contains(u.moduleID)
                select u;

如果可以直接在Where子句中建立一对多关系,请使用导航属性:

var name = User.Identity.GetUserName();
var Reports = db.Reports.Where(x => x.Module.User.Name == name);

谢谢你的快速回复,所有的回答都很好