当前位置 : 首页 » 互动问答 » 正文

MVC - 使用LINQ / lambda连接多个表 - 使用EF

分类 : 互动问答 | 发布时间 : 2016-01-28 14:56:28 | 评论 : 2 | 浏览 : 921 | 喜欢 : 0

我正在实现一个控制器,并且我需要获得具有某个RiskTypeID的所有工作人员,这些工作人员将在用户点击导航项时选择它。

以下是我将如何在SQL中创建连接

SQL

 Select
RTHG.RiskTypeID,
SM.FullName

来自RiskTypeHasGroup RTHG
内部连接RiskGroup RG On RTHG.RiskGroupID = RG.ID
内部连接RiskGroupHasGroupMembers RGHGM ON RG.ID = RGHGM.RiskGroupID
内部加入GroupMember GM ON RGHGM.GroupMemberID = GM.ID
内部加入GroupMemberHasStaffMember GMHSM ON GM.ID = GMHSM.GroupMemberID
内部加入StaffMember SM ON GMHSM.StaffMemberID = SM.ID

其中RTHG.RiskTypeID = 1

在使用Linq和lambda之前,我已经拉回了数据,但只使用简单的表达式,现在我需要能够进行一次调用,它将返回与上面列出的sql相同的数据,我已经在线搜索,但可以'找不到类似于我的需求的东西

这里是我的控制器,我把注释放在里面作为指导<public Transact> public ActionResult ViewRiskTypes(int SelectedRiskTypeID) {     var RiskTypes = _DBContext.RiskTypes.ToList(); //获取RiskTypes表中的所有当前项目,并将它们存储为Var RiskTypes中的List     var ViewModel = new List <RiskTypeWithDetails>(); //创建包含RiskTypeWithDetails实例的集合并将它们传递给ViewModel     var Details = new RiskTypeWithDetails(); //用详细信息创建RiskType的新实例并将实例存储在var Details中     foreach(RiskTypes中的RiskType)//遍历var RiskTypes中保存的每个Item     {         Details.RiskTypes.Add(new RiskTypesItem {ID = RiskType.ID,Description = RiskType.Description}); //将每个物品ID和描述分配给新的相同的场景         // RiskTypeItems的实例(它是RiskTypeWithDetails的一个属性)     }     foreach(RiskTypes中的RiskType)//遍历RiskTypes中的每个项目     {         如果(RiskType.ID == SelectedRiskTypeID)// Check Item ID匹配SelectedRiskTypeID值         {             // var Details = new RiskTypeWithDetails();             Details.RiskTypeDescription = RiskType.Description; //将风险类型描述赋给RiskTypeWithDetails RiskTypeDescription属性             Details.RiskDetails = _DBContext                 .RiskTypeHasGroups                 //.GroupMemberTypeHasGroupMembers                 .Rhere(r => r.RiskTypeID == SelectedRiskTypeID)// Where RiskTypeId匹配所选ID从Db返回以下数据                 。选择(r =>新的RiskDetails                 {                     RiskGroupDescription = r.RiskGroup.Description,                     GroupMembers = r.RiskGroup.RiskGroupHasGroupMembers                             .Select(v => v.GroupMember).ToList(),                     // StaffMembers = r.RiskGroup.RiskTypeHasGroups                     // .Join(r.RiskGroup.RiskTypeHasGroups,                     // a => a.RiskGroupID,b => b.RiskGroup.ID,                     //(a,b)=> new {a,b})                     // .Join(r.RiskGroup.RiskGroupHasGroupMembers,                     // C => c。)// Dosent加入,因为我期望...不知道该怎么做                 })ToList();             ViewModel.Add(详细信息); //将检索到的所有数据添加到ViewModel(这将在集合中创建一个项目)         }     }     返回View(ViewModel); }

Controller

正如您将看到的,我希望获得所有员工与所选RiskTypeID的匹配。我需要一些帮助,将上面的SQL转换为我的控制器中的lambda表达式

在此先感谢

Thanks in advance

回答(2)

  • 1楼
  • 你在注释掉的代码中处于正确的轨道上!对于初学者来说,LINQ有两个不同的联合体:query and 方法链对于像这样的实例,方法链

    语法就是它的位置。query这里是结果:_dbContext.RiskTypeHasGroup中的rhtg中的

    其中rhtg.RiskTypeID == 1 在_dbContext.RiskGroup中加入rg   对rhtg.RiskGroupID等于rg.ID 在_dbContext.RiskGroupHasGroupMembers中加入rghgm   在rg.ID等于rhtg.ID 在_dbContext.GroupMember中加入gm   在rg.ID等于gm.ID 在_dbContext.GroupMemberHasStaffMember中加入gmhsm   在gm.ID等于gmhsm.GroupMemberID 在_dbContext.StaffMember中加入sm   在gmhsm.StaffMemberID等于sm.ID 选择新的 {   rhtg.RiskTypeId,   sm.FullName };

    请注意,我对不同的变量使用了.Net约定。

    这里有一些关于

    的文档https://msdn.microsoft.com/en-us/library/gg509017.aspxquery syntax: https://msdn.microsoft.com/en-us/library/gg509017.aspx

  • 2楼
  • 您可以在linq中编写完全相同的查询,如下所示:

     var query =(从_DBContext.RiskTypeHasGroup RTHG中的RTHG
                在RTHG上的_DBContext.RiskGroup中加入RG .RiskGroupID等于RG.ID
                在RG.ID上的_DBContext.RiskGroupHasGroupMembers中加入RGHGM等于RGHGM.RiskGroupID
                在RGHGM.GroupMemberID = GM.ID的_DBContext.GroupMember中加入GM
                加入GMHSM的_DBContext.GroupMemberHasStaffMember GM.ID等于GMHSM.GroupMemberID
                在GMHSM.StaffMemberID的_DBContext.StaffMember中加入SM等于SM.ID
            其中RTHG.RiskTypeID == 1
            选择新的{RTHG.RiskTypeID,SM.FullName});

相关阅读: