繁体   English   中英

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

[英]Using a Linq query to select objects where any value of a property matches values from a list

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

任何帮助将不胜感激。

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

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;

您不能将intIEnumerable<int> 但是,如果你可以检查moduleID是内发现的modules是这样的:

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));

你很接近。 在 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM