将具有同一表的多个连接(具有多个条件)的SQL转换为LINQ

本文关键字:SQL 转换 LINQ 条件 连接 | 更新日期: 2023-09-27 18:09:01

如何将SQL转换为LINQ ?基本上,我有一个project_mstr表,其中有PR_CLASS, PR_TYPPR_GRP列。这3列是param_cdparams_mstr中的值。例如,有一条记录在param_cd中具有PR_TYP值,Regular作为其相应的param_val值。

我安装了Linquer,但我不舒服使用它,因为我仍然要创建一个连接到我的数据库。我也找不到在线SQLLINQ转换器。所以我请求这里的好心人帮助我进行转换。

SELECT 
    c.pr_id, c.pr_class, c.pr_typ, c.pr_grp, cp.pr_price, 
    c.gl_acct_id, c.pr_DESC "Project", 
    pm.param_val "Project Class", pm2.param_val "Project Type", pm3.param_val "Project Group"
FROM project_mstr c
JOIN 
    params_mstr pm ON c.pr_class = pm.param_id AND pm.param_cd = 'PR_CLASS'
JOIN 
    params_mstr pm2 ON c.pr_typ = pm2.param_id AND pm2.param_cd = 'PR_TYP'
JOIN 
    params_mstr pm3 ON c.pr_grp = pm3.param_id AND pm3.param_cd = 'PR_GRP'
JOIN 
    pr_price_mstr cp ON c.pr_id = cp.pr_id
JOIN 
    gl_acct_mstr gl ON c.gl_acct_id = gl.gl_acct_id
ORDER BY 
    c.crea_dt DESC;

将具有同一表的多个连接(具有多个条件)的SQL转换为LINQ

LINQ-to-SQL只支持对等连接,所以如果需要在连接中引入多个值,可以创建一个匿名类来表示连接的所有值(注意,匿名类需要是相同类型,这意味着它们需要(1)具有完全相同的字段名(2)具有完全相同的类型(3)具有完全相同的顺序)。

from c in ProjectMstr
join pm in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_CLASS" } equals new { pm.ParamId, pm.ParamCd }
join pm2 in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_TYP" } equals new { pm2.ParamId, pm2.ParamCd }
join pm3 in ParamsMstr on new { ParamId = c.ChClass, ParamCd = "CH_GRP" } equals new { pm3.ParamId, pm3.ParamCd }
// …
orderby c.CreaDt descending
select new {
    c.ChId,
    // …
    ProjectClass = pm.ParamVal,
    ProjectType = pm2.ParamVal,
    ProjectGroup = pm3.ParamVal,
}

或者,如果它不改变查询的逻辑,您可以从连接中将常量值提取到where中。

from c in ProjectMstr
join pm in ParamsMstr on c.ChClass equals pm.ParamId
join pm2 in ParamsMstr on c.ChClass equals pm2.ParamId
join pm3 in ParamsMstr on c.ChClass equals pm3.ParamId
// …
where pm.ParamCd == "CH_CLASS"
where pm2.ParamCd == "CH_TYP"
where pm3.ParamCd == "CH_GRP"
orderby c.CreaDt descending
select new {
    c.ChId,
    // …
    ProjectClass = pm.ParamVal,
    ProjectType = pm2.ParamVal,
    ProjectGroup = pm3.ParamVal,
}