首页 > 解决方案 > Linq 查询 - 根据条件跳过下一个查询执行

问题描述

我有 linq 语句来执行该函数。

return
                    from _1 in CheckNoConnectWithSelf(userId, new(request.UserFromId))
                    from _10 in CheckScopes(request.Scopes)
                    let userIdFrom = new UserId(request.UserFromId)
                    from _2 in CheckUserFromAsync(userIdFrom).ToAsync()
                    from invitationId in CheckValidAcceptAsync(userIdFrom, userId).ToAsync()
                    from _3 in CheckAlreadyConnectedAsync(userIdFrom, userId).ToAsync()
                    from transaction in BeginTransactionAsync().ToAsync()
                    from _4 in StoreConnectionAsync(userIdFrom, userId, invitationId, request.Status).ToAsync()
                    from _5 in CreateNewsEntryAsync(userIdFrom, userId).ToAsync()
                    from groupId in CreatePersonalGroupAsync(userIdFrom, userId).ToAsync()
                    from _6 in CreatePersonalChatAsync(groupId).ToAsync()
                    from _7 in AddGroupMemberAsync(groupId, userId).ToAsync()
                    //from _8 in AddGroupMemberAsync(groupId, userIdFrom).ToAsync()
                    from _9 in GrantScopesAsync(userId, userIdFrom, request.Scopes).ToAsync()
                    from _99 in CommitTransactionAsync(transaction).ToAsync()
                    select unit;

在这里,如果我想跳过几个步骤,例如请求中是否有特定值我不想执行 _6、_7 _8 和 _9 并直接调用 _99 我一直在尝试添加 if else 但我不想放if else 在每个函数中。

每个函数的说明 CheckNoConnectWithSelf -> 检查请求中的一些验证,如果某些内容无效则抛出异常,如果其良好的 CheckScopes 执行相同的操作则返回单位,并且 CheckUserFromAsync 通过执行 db 查询检查用户是否有效。CheckValidAcceptAsync - 还进行数据库查询并返回一些将在下一个函数中使用的值 BeginTransactionAsync 启动一个数据库事务并返回将用于在 CommitTransaction 中提交事务的事务。中间的其他功能将保存/更新数据库。例如-

private async Task<Either<GroupCreateResultStatus, GroupId>> CreatePersonalGroupAsync
                (GroupCreateRequest groupCreateRequest, UserId userId, GroupTypeDb groupType)
            {
                var user = await logic_.users_.GetUserByIdAsync(userId);

                var cryptor = Cryptor<GroupId>.Create(logic_.scopeRepository_, userId);
                var dek = Cryptor<GroupId>.GenerateKey();
                var salt = cryptor.GenerateSalt();

                var connectionRequest = new GroupDb
                {
                    CreatedBy = user.Id,
                    OwnedBy = user.Id,
                    GroupType = groupType,
                    Name = new(cryptor, dek, salt, groupCreateRequest.GroupName),
                    CreatedDateTime = DateTime.Now,
                    Status = GroupStatusDb.Active
                };

                var group = await logic_.repository_.AddAsync(connectionRequest);
                var groupId = new GroupId(group.Id);

                // TODO REI 20200124 Write dek and salt

                return groupId;
            }

此函数创建一条记录并返回将在其他函数中使用的 id

提前致谢

标签: c#entity-frameworklinq

解决方案


推荐阅读