【问题标题】:condition in a switch case codition开关情况下的条件
【发布时间】:2020-02-20 15:45:23
【问题描述】:

我有一个来自数据库的集合。并且在集合中有一个 vceq 具有的检查女巫状态。

集合是这样的:

  List<EcheqSubmissionInfoApi> submissions = await _patientDbContext.EcheqSubmissions
                .Where(s => s.AssignedToId == participantId)
                .OrderBy(s => (int)s.Status)
                .ThenByDescending(s => s.AssignedOnUtc)
                .Select(i => ConvertToPartialApi(i)).ToListAsync();

ConvertToPartialApi 方法如下所示:

 private static EcheqSubmissionInfoApi ConvertToPartialApi(EcheqSubmission submission)
        {         

            return new EcheqSubmissionInfoApi
            {
                Id = submission.Id,
                Status = submission.Status.StatusDbToApi(),
                DefinitionId = submission.DefinitionId,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };
        }

StatusDbToApi 是 switch case,像这样:

public static EcheqSubmissionStatusApi StatusDbToApi(this EcheqSubmissionStatus dbStatus)
        {
            EcheqSubmissionStatusApi status;
            EcheqSubmissionInfoApi echeqSubmissionInfoApi;

            if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;

                    //case EcheqSubmissionStatus.Expired:
                    //    status = EcheqSubmissionStatusApi.Expired;
                    //    break;
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status;
        }

但现在我想为过期状态建立一个检查。像这样:

 if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }

但是你当然会在该行上得到一个错误,因为它是未分配的。

但是如何正确地做呢?

谢谢

或者如何重构这个?

如果我这样做:

 EcheqSubmissionInfoApi echeqSubmissionInfoApi = new EcheqSubmissionInfoApi();

            if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
ValidUntilUtc

总是为空

好吧,我把这个:


public class EcheqSubmission{
   public EcheqSubmissionStatusApi StatusDbToApi(EcheqSubmissionStatus dbStatus, EcheqSubmissionInfoApi echeqSubmissionInfoApi)
        {
            EcheqSubmissionStatusApi status;
           // EcheqSubmissionInfoApi echeqSubmissionInfoApi = new EcheqSubmissionInfoApi();

            if (echeqSubmissionInfoApi.ValidUntilUtc < DateTime.Now)
            {
                return EcheqSubmissionStatusApi.Expired;
            }
            else
            {

                switch (dbStatus)
                {
                    case EcheqSubmissionStatus.New:
                        status = EcheqSubmissionStatusApi.New;
                        break;
                    case EcheqSubmissionStatus.Active:
                        status = EcheqSubmissionStatusApi.Active;
                        break;
                    case EcheqSubmissionStatus.Submitted:
                        status = EcheqSubmissionStatusApi.Submitted;
                        break;

                    //case EcheqSubmissionStatus.Expired:
                    //    status = EcheqSubmissionStatusApi.Expired;
                    //    break;
                    default:
                        throw new ArgumentOutOfRangeException(nameof(dbStatus), dbStatus, "Not a valid status enum");
                }
            }
            return status;
        }

}

在课堂上:

EcheqSubmission

那么 this 的返回类型是什么:

 private static EcheqSubmissionInfoApi ConvertToPartialApi(EcheqSubmission submission)
        {         

          var result =  new EcheqSubmissionInfoApi
            {
                Id = submission.Id,
                Status = submission.Status.StatusDbToApi(),
                DefinitionId = submission.DefinitionId,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };

            result.Status = submission.Status.StatusDbToApi();


        }

【问题讨论】:

  • 使用:EcheqSubmissionStatusApi status = new EcheqSubmissionStatusApi() ;
  • StatusDbToApi 不应是静态方法,而是 EcheqSubmission 类的方法部分。状态 = submit.GetStatusBasedOnValidity()
  • 好吧,但总觉得这不是好看的代码。不是吗?
  • 这没有意义,因为总是返回相同的值。您要么必须将值作为方法的参数,要么是 class 的静态成员,要么在方法本身中动态分配值。
  • 看来您实际上想将submission.ValidUntilUtc 传递给StatusDbToApi 方法以使用它。

标签: c# entity-framework linq .net-core


【解决方案1】:

您有多种选择来解决您的问题;

1) 将submission.ValidUntilUtc 作为参数输入StatusDbToApi(),这样您就有一个简单的DateTime 进行检查

2) 先创建你的EcheqSubmissionInfoApi,不填状态,创建后设置状态:

var result = new EcheqSubmissionInfoApi
            {
                Id = submission.Id,
                DefinitionId = submission.DefinitionId,
                SubmittedOnUtc = submission.SubmittedOnUtc,
                AssignedByOrgId = submission.AssignedByOrgId,
                AssignedByProfId = submission.AssignedByProfId,
                AssignedOnUtc = submission.AssignedOnUtc,
                AssignedToId = submission.AssignedToId,
                ValidUntilUtc = submission.ValidUntilUtc,
                CurrentPage = submission.CurrentPage,
                Progress = submission.Progress
            };
result.Status = submission.Status.StatusDbToApi();

3) 将StatusDbToApi 重写为EcheqSubmissionStatus 上返回正确状态的非静态方法。

【讨论】:

  • 嗨,马克。谢谢你。但是返回类型在哪里呢?
  • 还有这个方法:public static EcheqSubmissionStatusApi StatusDbToApi(this EcheqSubmissionStatus dbStatus)有五个引用
  • 嗨,马克。你在吗?
  • 它不是聊天应用,我也需要睡觉 :) 选项 3 的返回类型是 EcheqSubmissionStatusApi。看来您编辑的方法应该有效,不是吗?
  • ?但是是的,但是我在方法中添加了一个额外的参数。所以它在这个方法中有一个参考:
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多