所以我试图通过当前登录用户的userID过滤模块对象列表。之后我试图获取那些选定对象的moduleID。
使用它我想要将报告列表过滤为仅包含与之前获得的任何moduleID列表匹配的moduleID的列表。
我对linq并不是特别有见识,这就是我想出来的
var name = User.Identity.GetUserName();
ApplicationUser currentUser = (ApplicationUser)db.Users.Single(x => x.UserName == name); //gets the currently logged in user
var modules = (from i in db.Modules
where i.User == currentUser
select i.ModuleID); //gets moduleID's for modules owned by current user
var Reports = from u in db.Reports
where u.moduleID == modules
select u;
我在尝试将contains方法合并到语句中时遇到了问题。
任何帮助都将不胜感激。
答案 0 :(得分:0)
您无法将int
与IEnumerable<int>
进行比较。但是,您可以检查moduleID
中是否找到modules
,如下所示:
where modules.Contains(u.moduleID)
答案 1 :(得分:0)
你走在正确的轨道上。
var Reports = from u in db.Reports
where modules.Contains(u.moduleID)
select u;
或者使用lambda:
var reports = db.Reports.Where(u => modules.Contains(u));
答案 2 :(得分:0)
如果我正确推断您的表格结构,您可以将多个查询简化为一个:
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;
答案 3 :(得分:0)
你很亲密。在Linq中,它与标准SQL略微相反。在它的情况下,您想要查看报告的模块ID是否包含在模块列表中,因此它看起来像这样:
{{1}}
答案 4 :(得分:0)
如果您在Where子句中可以直接执行一对多关系,请使用导航属性:
var name = User.Identity.GetUserName();
var Reports = db.Reports.Where(x => x.Module.User.Name == name);