【发布时间】:2017-05-18 12:16:24
【问题描述】:
我的 LinQ 代码:
var query = ctx.PERSON.Where(p => p.EMAIL == login && p.PASSWD == pass && p.STATUS == 1)
.Join(ctx.INSTITUTION, p => p.FK_INSTITUTION, inst => inst.ID,(person, institution) => new {person, institution})
.Join(ctx.PERSON_INSTITUTION, p => p.person.ID, perProj => perProj.FK_PERSON, (p, perProj) => new {p, perProj})
//.Join(ctx.PROJECT, p => p.perProj.FK_INSTITUTION, proj => proj.ID, (p, proj) => new {p, proj})
.Join(ctx.PRIVILEGE_ROLE, p => p.perProj.FK_ROLE, privRol => privRol.FK_ROLE,(p, privRol) => new {p, privRol})
.Join(ctx.PRIVILEGE, p => p.privRol.FK_PRIVILEGE, priv => priv.ID, (p, priv) => new {p, priv})
.Where(p => p.priv.NAME == "resource/mul/upload")
.Select(
p =>
new UserModel
{
Login = p.p.p.p.person.EMAIL,
FirstName = p.p.p.p.person.NAME,
LastName = p.p.p.p.person.SURNAME,
UserId = p.p.p.p.person.ID,
InstitutionId = p.p.p.p.institution.ID,
InstitutionName = p.p.p.p.institution.NAME,
OrganizationUnitId = (decimal)p.p.p.p.institution.FK_SWD_ORGANIZATION_UNIT
});
它生成这样的sql:
SELECT
1 AS `C1`,
`Extent1`.`EMAIL`,
`Extent1`.`NAME`,
`Extent1`.`SURNAME`,
`Extent1`.`ID`,
`Extent2`.`ID` AS `ID1`,
`Extent2`.`NAME` AS `NAME1`,
`Extent2`.`FK_SWD_ORGANIZATION_UNIT`
FROM `PERSON` AS `Extent1`
INNER JOIN `INSTITUTION` AS `Extent2` ON `Extent1`.`FK_INSTITUTION` = `Extent2`.`ID`
INNER JOIN `PERSON_INSTITUTION` AS `Extent3` ON `Extent1`.`ID` = `Extent3`.`FK_PERSON`
INNER JOIN `PRIVILEGE_ROLE` AS `Extent4` ON `Extent3`.`FK_ROLE` = `Extent4`.`FK_ROLE`
INNER JOIN `PRIVILEGE` AS `Extent5` ON `Extent4`.`FK_PRIVILEGE` = `Extent5`.`ID`
WHERE (1 = (`Extent1`.`STATUS`)) AND (((`Extent1`.`EMAIL` = @p__linq__0) AND (`Extent1`.`PASSWD` = @p__linq__1)) AND (@gp1 = `Extent5`.`NAME`))
我不知道如何修改我的 linq 查询来获得这样的 sql 输出:
SELECT
1 AS `C1`,
`Extent1`.`EMAIL`,
`Extent1`.`NAME`,
`Extent1`.`SURNAME`,
`Extent1`.`ID`,
`Extent2`.`ID` AS `ID1`,
`Extent2`.`NAME` AS `NAME1`,
`Extent2`.`FK_SWD_ORGANIZATION_UNIT`
FROM `PERSON` AS `Extent1`
INNER JOIN `INSTITUTION` AS `Extent2` ON `Extent1`.`FK_INSTITUTION` = `Extent2`.`ID`
INNER JOIN `PERSON_INSTITUTION` AS `Extent3` ON `Extent1`.`ID` = `Extent3`.`FK_PERSON` AND `Extent3`.`STATUS`=1
INNER JOIN `PRIVILEGE_ROLE` AS `Extent4` ON `Extent3`.`FK_ROLE` = `Extent4`.`FK_ROLE`
INNER JOIN `PRIVILEGE` AS `Extent5` ON `Extent4`.`FK_PRIVILEGE` = `Extent5`.`ID`
WHERE (1 = (`Extent1`.`STATUS`)) AND (((`Extent1`.`EMAIL` = @p__linq__0) AND (`Extent1`.`PASSWD` = @p__linq__1)) AND (@gp1 = `Extent5`.`NAME`))
所以我需要将 AND Extent3.STATUS=1 添加到我的加入中。任何建议如何修改上述 linq 查询以获得需要的结果?
【问题讨论】:
-
只需将该条件添加到 where 子句中,对于内部连接它是相同的。
-
你可以把它添加到where。另外你为什么不使用导航属性而不是连接coding.abel.nu/2012/06/dont-use-linqs-join-navigate
-
嗯,这不是我的代码,我是新手 int.... 如何将它添加到哪里?对不起,愚蠢的问题
-
p.p.p.p.person看在上帝的份上!