我试图用 LINQ 替换 SQL 代码以便迁移到 MVC,但我不知道如何在 LINQ 中使用子查询。截至目前,我已经用 LINQ 替换了内部 sql 查询,我想知道如何处理外部查询。
以下是SQL查询
SELECT
DISTINCT GP_REGION.REGION_MAIN Region_Code,
R1.REGION_NAME
FROM
GP_REGION
INNER JOIN GP_REGION R1 ON GP_REGION.REGION_MAIN = R1.REGION_CODE
WHERE
GP_REGION.REGION_HAS_DATA = 'Y'
AND
GP_REGION.REGION_MAIN IN
(
SELECT
DISTINCT AR.BRANCH_CODE
FROM
PORTAL.UA_APPLN_ROLE AR
INNER JOIN PORTAL.UA_GROUP G ON AR.GROUP_CODE = G.GROUP_CODE
WHERE
G.USER_ID = '" + Global.UserId() + "' AND AR.APPLICATION_ID = '" + ApplicationId + "'
)
ORDER BY
GP_REGION.REGION_MAIN
在这里,我使用以下 LINQ 替换了内部查询,如下所示
var regions = from p in db3.UA_APPLN_ROLE.AsEnumerable()
join i in db3.UA_GROUP.AsEnumerable()
on p.GROUP_CODE equals i.GROUP_CODE
where
i.USER_ID == Global.UserId()
&&
p.APPLICATION_ID == ConfigurationManager.AppSettings["ApplicationId"]
select new
{
branchcode = p.BRANCH_CODE
};
但我想知道外部 sql 查询如何替换并加入我编写的现有 LINQ 代码
最佳答案
您将子查询组合到主查询中,如下所示:
var efQuery = from gp in db3.GP_REGION
join r1 in db3.GP_REGION on gp.REGION_MAIN equals r1.REGION_CODE
where regions.Contains(gp.REGION_MAIN)
&& gp.REGION_HAS_DATA = "Y"
select new
{
Region_Code = gp.REGION_MAIN,
Region_Name = r1.REGION_NAME
};
var queryResult = efQuery.Distinct().OrderBy(x => x.Region_Code);
您可以使用 .AsNoTracking()
加快处理速度,例如db3.GP_REGION.AsNoTracking()
。
一般来说,监控生成的 SQL 查询是个好主意,以避免它在代码中看起来很简单,但却被转换成糟糕的 SQL 的情况。
但在我看来,让查询成为代码中的一流成员(与字符串中的 SQL 相比)的优势超过了有时生成的非直观 SQL。
关于c# - 用 Linq 替换在 asp.net 中编写的旧 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357553/