繁体   English   中英

如何使用条件语句返回IEnumerable Linq值

[英]How to return IEnumerable Linq value with conditional statement

我在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?   
        }

典型的方法是返回null ,空的可枚举Enumerable.Empty<SASF>()或抛出ArgumentException ,具体取决于您的需要。

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

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

您在过滤后查询几乎相似的查询并按相同列排序。 如果使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM