【问题标题】:Modify Linq code, add AND statement to join修改Linq代码,加入AND语句加入
【发布时间】: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 看在上帝的份上!

标签: c# sql linq lambda


【解决方案1】:

您需要将 Where 添加到 LINQ where

.Where(p => p.priv.NAME == "resource/mul/upload")

变成

.Where(p => p.priv.NAME == "resource/mul/upload" && p.perProj.Status ==1)

p.perProj 很难猜,但智能感知应该可以帮到你。

【讨论】:

  • 好像是 'p.p.p.perProj.STATUS==1' ?
  • 试一试,没有智能感知,我无法很好地阅读 linq。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多