将 SQL 子查询转换为 Linq 查询

Posted

技术标签:

【中文标题】将 SQL 子查询转换为 Linq 查询【英文标题】:Converting a SQL subqueries to Linq query 【发布时间】:2016-04-20 13:55:11 【问题描述】:

我正在尝试将此 sql 转换为 Linq 查询,但没有成功。你能帮忙吗?

SELECT  G.Id,G.UserGroupName, G.Status, G.IsDeleted ,(SELECT COUNT(*) FROM UserGroupMapping U WHERE U.UserGroupId=G.Id) [UserCount]   
,(SELECT COUNT(*) FROM UserGroupRoleMapping R WHERE R.UserGroupId=G.Id) [RolesCount]  
FROM UserGroup G

【问题讨论】:

UserGroupUserGroupRoleMapping 之间是否存在一对多关系,对吗?您能否展示您的实体以及到目前为止您尝试了什么? LINQ 不能替代 SQL。 EF 是一个 ORM,它处理实体,not 表。 为什么要转换此语句?您不能将结果用作对象,这意味着它可能不应该被转换。如果您的 UserGroup 和 Mapping 表之间有适当的关系,您可以要求 Count()RolesGroups 关系。如果你只是想显示一个报告,SQL 是最简单和最快的选择 我在实体之间有适当的关系,但我怎样才能获得角色和组关系的 Count() ?任何可以帮助我的例子 【参考方案1】:

如果您在 UserGroupUserGroupRoleMapping 之间存在一对多关系,并且您已在 EF 模型中正确表示该关系,那么您可以执行如下查询:

var query=context.UserGroups.Select(ug=>new
                                             Id=usg.Id,
                                             UserGroupName=ug.UserGroupName, 
                                             Status=ug.Status,
                                             IsDeleted=ug.IsDeleted,
                                             RolesCount=ug.UserGroupRoles.Count() 
                                           );

我假设您的 UserGroup 实体中有一个集合导航属性:

public class UserGroup

   //...
   public virtual ICollection<UserGroupRoleMapping> UserGroupRolesget;set;

【讨论】:

哇!你刚刚救了我。非常感谢 如果你能帮助我解决另一个困惑,那就太好了。如果不是上面的代码,而是使用下面的代码,即我首先在 userGroupList 中引入结果,然后按照您的建议从另一个表中计数后将其转换为我想要的类型。这是正确的方式吗? //foreach (var obj in userGroupList) // // objList.Add(new UserGroupRoleModel TotalUsers = obj.UserGroupMappings.Count(), TotalRoles = obj.UserGroupRoleMappings.Count() ); //

以上是关于将 SQL 子查询转换为 Linq 查询的主要内容,如果未能解决你的问题,请参考以下文章

具有 CASE 和子查询的 sql to LINQ

如何将此 GROUP BY / MIN SQL 查询转换为 LINQ?

LINQ 选择中的 C# 子查询

如何将带有子选择的 SQL 查询转换为 MDX 查询?

使用带有子查询的最大查询将SQL / PL行转换为列

LINQ 表达式未转换为 SQL