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

时间:2016-06-15 17:13:45

标签: c# entity-framework linq

所以我试图通过当前登录用户的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方法合并到语句中时遇到了问题。

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:0)

您无法将intIEnumerable<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);