如何使用条件语句返回IEnumerableLinq值

本文关键字:IEnumerableLinq 返回 语句 何使用 条件 | 更新日期: 2023-09-27 18:01:51

我在IEnumerable Linq查询中有一个条件"if... else if..."语句。我得到以下错误:

并非所有代码路径都返回值

下面是我的代码。

public IEnumerable<SASF> GetLongReportData(string commSubGp)
        {
            var context = new Entities();
            string myDate = "2014-03-18";
            DateTime date = Convert.ToDateTime(myDate);

            if (commSubGp == "F00")
            {

                var getAgriculture = from a in context.SASF                
                                     where a.RDate == date &&
                                     a.COMM_SGP.CompareTo("F00") <= 0
                                     orderby a.Conmkt, a.MKTTITL descending
                                     select a;
                return getAgriculture.ToList();
            }
            else if (commSubGp == "n10")
            {
                var getPetroleum = from p in context.SASF
                                   where p.RDate == date &&
                                   p.COMM_SGP == "n10"
                                   orderby p.Conmkt, p.MKTTITL descending
                                   select p;
                return getPetroleum.ToList();
            }
            return ??????;     // what should be here?   
        }

如何使用条件语句返回IEnumerableLinq值

根据需要,典型的方法是返回null,一个空的可枚举Enumerable.Empty<SASF>()或抛出一个ArgumentException

如果"F00"answers"n10"是commSubGp唯一可以具有的有效值,则应该为此参数抛出ArgumentException。在这种情况下,编译器将停止要求返回。

更干净:将此参数设为枚举或布尔。例如,仅具有值AgriculturePetroleum的枚举ReportType

您正在查询几乎相似的查询,并在过滤后按相同的列排序。如果使用switch语句添加特定的筛选器,并在有人提供了不受支持的参数时抛出未实现的异常,则可以使代码更易于维护,而且必须以某种方式处理null参数的情况。

public IEnumerable<SASF> GetLongReportData(string commSubGp)
{
    var context = new Entities();
    var date = Convert.ToDateTime("2014-03-18");
    var sasf = (from s context.SASF
                where a.RDate == date
                select s);
    if (!String.IsNullOrEmpty(commSubGp))
    {
        switch (commSubGp)
        {
            case "F00":
                sasf = (from s in sasf
                        s.COMM_SGP.CompareTo("F00") <= 0
                        select s);
                break;
            case "n10":
                sasf = (from s in sasf
                        s.COMM_SGP == "n10"
                        select s);
                break;
            default:
                throw new NotImplementedException(String.Format("commSubGp {0} not implemented", commSubGp));
        }
    }
    else
    {
        throw new ArgumentNullException("Parameter commSubGp is null");
    }
    return sasf.OrderBy(p => p.Conmkt).ThenByDescending(p => p.MKTTITL).ToList();      
}

我想这取决于您实际想要返回的内容

return Enumerable.Empty<SASF>();

return null;

或者抛出异常。。。

return new List<SASF>(); 

或者异常或null。

实际上并没有那么难。在if案例之上创建结果并返回。

您的默认结果是一个空的

对于其他情况和/或未来的情况,创建一个根据正确标准填写的情况

 public IEnumerable<SASF> GetLongReportData(string commSubGp)
    {
        var context = new Entities();
        //ALSO Change
        //string myDate = "2014-03-18";
        //DateTime date = Convert.ToDateTime(myDate);
        var date = new DateTime(2014,3,18);
        //Create a result in the type you want to return.
        var result = new List<SASF>();
        switch(commSubGp)
        {
            case "F00": //Agriculture
                result = (from a in context.SASF                
                             where a.RDate == date &&
                             a.COMM_SGP.CompareTo(commSubGp) <= 0
                             orderby a.Conmkt, a.MKTTITL descending
                             select a).ToList();
                break;
            case "n10": //petroleum
                result = (from p in context.SASF
                           where p.RDate == date &&
                           p.COMM_SGP == commSubGp
                           orderby p.Conmkt, p.MKTTITL descending
                           select p).ToList();
                break;
        }
        return result;     
    }

将新变量定义为

IEnumerable<SASF> sasf = null;

并返回return sasf;

public IEnumerable<SASF> GetLongReportData(string commSubGp)
{
  IEnumerable<SASF> sasf;
  if(condition)
  {
    //your stuff and put it in sasf
  }
  else if(condition)
  {
    //your stuff and put it in sasf
  }
  return sasf;
}