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);
谢谢你的快速回复,所有的回答都很好