LeftJoinIF的问题 返回

SqlSugar 沟通中
18 161

        var memberFollowsListquery = _memfollow.AsSugarClient().Queryable<MemberFollow>().SplitTable()

                .LeftJoinIF<Member>(input.FollowTypeId == 1, (f, m) => f.UserId == m.Id)

                .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m) => f.FollowerId == m.Id)

              .WhereIF(input.FollowTypeId == 1, f => f.UserId == _userManager.UserId)

              .WhereIF(input.FollowTypeId != 1, f => f.FollowerId == _userManager.UserId)

              .Select((f, m) => new MemberFollowsOutput() { 

                UserId = f.Id,

                UserName=m.NickName,

                UserLogo=m.Avatar

              });

这种写法为什么会显示错误呢,f,m这个参数肯定会有的

热忱回答18

  •            .LeftJoinIF<Member>(input.FollowTypeId == 1, (f, m) => f.UserId == m.Id)

                    .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m,m2) => f.FollowerId == m.Id)


    正确用法这样

    0 回复
  • 那我select里面要怎么判断是用m 还是m2呢?第二个LeftJoinIF里面的三个参数分别表示什么呢,因为第一个LeftJoinIF执行了 第二个就不会执行了,那Select((f, m,m2) 里面的m2还有什么意义呢?我觉的我原来的写法不应该是错误的,反而是正确的,因为我的两个LeftJoinIF是互斥的,不会同时执行的。麻烦解答一下

     var memberFollowsListquery = _memfollow.AsSugarClient().Queryable<MemberFollow>().SplitTable()

                    .LeftJoinIF<Member>(input.FollowTypeId == 1, (f, m) => f.UserId == m.Id)

                    .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m,m2) => f.FollowerId == m.Id)

                  .WhereIF(input.FollowTypeId == 1, f => f.UserId == _userManager.UserId)

                  .WhereIF(input.FollowTypeId != 1, f => f.FollowerId == _userManager.UserId)

                  .Select((f, m,m2) => new MemberFollowsOutput() { 

                    UserId = f.Id,

                    UserName=m.NickName,

                    UserLogo=m.Avatar

                  });


    0 回复
  • @fate sta:刚刚问题忘记@你了


    0 回复
  • 不要考虑select一般用来做过滤的

    0 回复
  • 如果非要select你可以

    var queryable=

    emfollow.AsSugarClient().Queryable<MemberFollow>().SplitTable()

                    .LeftJoinIF<Member>(input.FollowTypeId == 1, (f, m) => f.UserId == m.Id)

                    .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m,m2) => f.FollowerId == m.Id)

                  .WhereIF(input.FollowTypeId == 1, f => f.UserId == _userManager.UserId)

                  .WhereIF(input.FollowTypeId != 1, f => f.FollowerId == _userManager.UserId);

    if(xx){

     return query.select().tolst();

    }else

    {

     return query.select().tolst();

    }


    0 回复
  • @fate sta:如果还需要IF else 就没必要用LeftJoinIF 和WhereIF了,按照我原来的写法 感觉是没错的,多了一个m2反而无法满足我的select,因为我使用LeftJoinIF只是想连两张表,不是要连3张

    0 回复
  • @fate sta:我的input.FollowTypeId == 1和input.FollowTypeId != 1是互斥的条件,最多只能执行一个

    0 回复
  • select是不好处理

    0 回复
  • @fate sta:按照你的这个写法 我的第一个input.FollowTypeId ==1这个 LeftJoinIF不执行,那么执行 input.FollowTypeId!=1的这个 LeftJoinIF,那么(f, m,m2)这个3个参数分别表示哪三个表呢

    0 回复
  •    .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m,m2) => f.FollowerId == m2.Id)

    0 回复
  • 只用m2就行了

    0 回复
  • @fate sta:那用select的使用在不使用ifelse的情况下,是不是就没办法同时使用m和m2了?

    0 回复
  • @生而平等:目前就是leftjoin if处理不了select

    0 回复

  • 还有一个办法就是用动态字段


    var name=isxxxx? "m1.name"?"m2.name"



    然后Select中

    Name==SqlFunc.MappingColumn<string>(name)

    0 回复
  • @fate sta:这样还是不行,字段要是很多的话,那不是要定义好多个name 还是写一下if else 吧

    0 回复
  • @生而平等:经过我测试 

     .LeftJoinIF<Member>(input.FollowTypeId == 1, (f, m) => f.UserId == m.Id)

                    .LeftJoinIF<Member>(input.FollowTypeId != 1, (f, m,m2) => f.FollowerId == m.Id)

    没办法使用两个LeftJoinIF:满足第一个条件input.FollowTypeId == 1,第一个LeftJoinIF可以执行成功;不满足第一个条件,满足第二个条件input.FollowTypeId != 1,select的时候有m2就没有m,还是会报错

    0 回复
  • @fate sta:满足:input.FollowTypeId != 1条件;
    代码:

    var memberFollowsListquery = _memfollow.AsSugarClient().Queryable<MemberFollow>().SplitTable()

            .LeftJoinIF<Member>(input.FollowTypeId == 1, (a, b) => a.UserId == b.Id)

            .LeftJoinIF<Member>(input.FollowTypeId != 1, (a, b, c) => a.FollowerId == c.Id)

          .WhereIF(input.FollowTypeId == 1, a => a.UserId == _userManager.UserId)

          .WhereIF(input.FollowTypeId != 1, a => a.FollowerId == _userManager.UserId);

    string memberFollowsListquerysqlstring= memberFollowsListquery.ToSqlString();

    memberFollowsListquerysqlstring 对应的sql:

     SELECT `a`.* FROM  (SELECT * FROM  (SELECT * FROM  ( ( SELECT `UserId`,`FollowerId`,`IsMutualfollow`,`FollowerTime`,`CreateTime`,`UpdateTime`,`CreateUserId`,`CreateUserName`,`UpdateUserId`,`UpdateUserName`,`IsDelete`,`Id` FROM `member_follow_20240201`  WHERE ( `IsDelete` = 0 )  AND ( `IsDelete` = 0 )  )   UNION ALL 

     ( SELECT `UserId`,`FollowerId`,`IsMutualfollow`,`FollowerTime`,`CreateTime`,`UpdateTime`,`CreateUserId`,`CreateUserName`,`UpdateUserId`,`UpdateUserName`,`IsDelete`,`Id` FROM `member_follow_20231201`  WHERE ( `IsDelete` = 0 )  AND ( `IsDelete` = 0 )  )  ) unionTable )) `a` Left JOIN `member` `c` ON ( `a`.`FollowerId` = `c`.`Id` )   WHERE ( `a`.`FollowerId` = 31699022728261 ) 

    执行报错:1248 - Every derived table must have its own alias

    0 回复
  • 提供完整DEMO SQL看不出问题

    0 回复