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

C# 如何使用条件语句返回IEnumerable Linq值,c#,linq,C#,Linq,我在IEnumerableLinq查询中有一个条件“if…else if…”语句。我得到以下错误: 并非所有代码路径都返回值 下面是我的代码 public IEnumerable<SASF> GetLongReportData(string commSubGp) { var context = new Entities(); string myDate = "2014-03-18"; DateT

我在
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?   
        }
public IEnumerable GetLongReportData(字符串commSubGp)
{
var context=新实体();
字符串myDate=“2014-03-18”;
DateTime日期=Convert.ToDateTime(myDate);
如果(commSubGp==“F00”)
{
var getAgriculture=来自context.SASF中的
其中a.RDate==日期&&

a、 COMM_SGP.CompareTo(“F00”)典型的方法是返回
null
,一个空的可枚举
enumerable.empty()
,或者根据需要抛出一个
ArgumentException

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


更干净:将此参数设置为enum或bool。例如,enum
ReportType
仅包含值
Agriculture
Petroleum
,我想这取决于您实际想要返回的值

return Enumerable.Empty<SASF>();
或引发异常…

返回新列表();
return new List<SASF>(); 

或异常或null。

将新变量定义为

IEnumerable<SASF> sasf = null;

过滤后,您正在按相同的列查询几乎相似的查询和排序。如果您使用switch语句添加特定的筛选器,并在有人提供不受支持的参数时抛出not implemented exception,则可以使代码更易于维护,同时还必须以某种方式避免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();      
}
public IEnumerable GetLongReportData(字符串commSubGp)
{
var context=新实体();
var日期=转换到当前时间(“2014-03-18”);
var sasf=(来自s context.sasf
其中a.RDate==日期
选择s);
如果(!String.IsNullOrEmpty(commSubGp))
{
开关(commSubGp)
{
案例“F00”:
sasf=(来自sasf中的s)
s、 COMM_SGP.CompareTo(“F00”)p.Conmkt),然后按降序(p=>p.MKTTITL).ToList()进行比较;
}

事实上,这并不难。在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;     
    }
public IEnumerable GetLongReportData(字符串commSubGp)
{
var context=新实体();
//也改变
//字符串myDate=“2014-03-18”;
//DateTime日期=Convert.ToDateTime(myDate);
var日期=新的日期时间(2014,3,18);
//以要返回的类型创建结果。
var result=新列表();
开关(commSubGp)
{
案例“F00”://农业
结果=(来自context.SASF中的
其中a.RDate==日期&&


a、 COMM_SGP.CompareTo(commSubGp)好吧,你需要自己回答它。如果你不给参数commSubGp,你想返回什么?如果你不想返回任何东西,就返回null,而不是返回一个空集合。或者抛出一个参数异常。在你的
else if{}后面放一个
else
tag。这会让阅读更符合逻辑:在做其他事情之后再这样做。这可能会帮助您知道要返回什么-例如返回
null
,或引发新异常:
引发新异常(“消息”)
您不妨使用
return null;
。他不应该设置sasf=他的东西,而不是在条件中返回它吗?@Hinek是的,他可以设置sasf=他的东西。我没有在回答中标记它,只是提出了一种处理函数返回类型的方法:)@Dirk,是的,我们可以在这里返回null,但是OP需要正确处理。我想我们只是对
//返回您的东西
;)有不同的理解,让n10和F00在linq类型安全中,那么它最终是正确的;=>看到我们几乎有相同的解决方案:s;+1用于argumentException和更易于维护的代码我不会去这里有一个
NotImplementedException
。最好是使用
ArgumentException
NotImplementedException
通常是为整个方法不存在时保留的,因为它要么还没有实现,要么永远都有一个实现是不明智的y参数的值无效。此
var result=new IEnumerable();
不应编译,无法创建接口实例。
var result=Enumerable.Empty()
会起作用。在这里,您创建了一个列表,您将在每个有效的案例中丢弃它。您最好等到您实际遇到该案例时再这样做。
可枚举。空的
比新建一个您碰巧知道永远不会添加项目的列表更好地传达正在发生的事情的意图。n我不确定你的意思是什么,但我确信这会起作用。我也没有让返回发生在这样的情况下,OP会看到只使用了1个列表。可能有更好的编写方法,我会告诉你。这段代码不会编译。你返回的是一个没有明确赋值的变量。你不应该返回null.Eit她返回一个空序列,抛出一个异常,或者确保情况不能从一开始就出现。嗯,在某些情况下,null是一个有效的方法。在他的情况下,我会倾向于使用我提到的ArgumentException,或者使用enum或bool来避免这种情况(也提到过)。。。
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();      
}
 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;     
    }