Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在lambda表达式中返回不同的数据类型?_C#_Linq_Lambda - Fatal编程技术网

C# 如何在lambda表达式中返回不同的数据类型?

C# 如何在lambda表达式中返回不同的数据类型?,c#,linq,lambda,C#,Linq,Lambda,我想获得以下功能。但由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下,我会怎么做 .OrderBy(X => { switch (OrderByColumn) { case "": return X.a.CreatedOn; case "BookCategoryNam

我想获得以下功能。但由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下,我会怎么做

.OrderBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return X.a.CreatedOn;
                   case "BookCategoryName":
                      return X.a.BookCategoryName;
                   case "BookCategoryDescription":
                      return X.a.BookCategoryDescription;
                }
                return X.a.CreatedOn;
             });

或任何其他获得此功能的建议?

我建议您更改生成查询的逻辑,而不是在lambda中创建此类逻辑:

在类似之前生成查询:

var query = list.Where(...);

if(OrderByColumn=="BookCategoryName")
{
   query = query.OrderBy(x=>x.a.BookCategoryName);
}
....
最后:

var result = query.ToList(); //for e.g.

它将根据您的需要工作,并且看起来更干净

我建议您更改构建查询的逻辑,而不是在lambda中创建这样的逻辑:

在类似之前生成查询:

var query = list.Where(...);

if(OrderByColumn=="BookCategoryName")
{
   query = query.OrderBy(x=>x.a.BookCategoryName);
}
....
最后:

var result = query.ToList(); //for e.g.

它将根据您的需要工作,并且看起来更干净

对于当前lambda可能返回的每个数据类型,使用单独的块定义顺序,对于不使用该返回类型的任何选项,返回常量

目前,假设
CreatedOn
是一个
DateTime
BookCategoryName
BookCategoryDescription
是字符串,它将类似于:

.OrderBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return X.a.CreatedOn;
                   case "BookCategoryName":
                      return new DateTime(1900,1,1);
                   case "BookCategoryDescription":
                      return new DateTime(1900,1,1);
                }
                return X.a.CreatedOn;
             })
.ThenBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return "";
                   case "BookCategoryName":
                      return X.a.BookCategoryName;
                   case "BookCategoryDescription":
                      return X.a.BookCategoryDescription;
                }
                return "";
             });

(当然,常量值可以移到实数常量或变量等,但我想让上面的代码片段自包含)

对于当前lambda可能返回的每个数据类型,使用单独的块定义顺序,对于不使用该返回类型的任何选项,返回常量

目前,假设
CreatedOn
是一个
DateTime
BookCategoryName
BookCategoryDescription
是字符串,它将类似于:

.OrderBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return X.a.CreatedOn;
                   case "BookCategoryName":
                      return new DateTime(1900,1,1);
                   case "BookCategoryDescription":
                      return new DateTime(1900,1,1);
                }
                return X.a.CreatedOn;
             })
.ThenBy(X =>
             {
                switch (OrderByColumn)
                {
                   case "":
                      return "";
                   case "BookCategoryName":
                      return X.a.BookCategoryName;
                   case "BookCategoryDescription":
                      return X.a.BookCategoryDescription;
                }
                return "";
             });

(当然,常量值可以移出为实数常量或变量等,但我想让上面的代码片段自包含)

,另一个选项是将排序字段选择本身提取到一个单独的方法中,如下所示:

public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate)
{
    return data
        .Where(predicate)
        .OrderBy(GetCurrentOrderingField);
}

private IComparable GetCurrentOrderingField(Data x)
{
    switch (OrderByColumn)
    {
        case "BookCategoryName":
            return x.a.BookCategoryName;

        case "BookCategoryDescription":
            return x.a.BookCategoryDescription;
    }

    return x.a.CreatedOn;
}
public IEnumerable SelectData(IEnumerable数据,Func谓词)
{
返回数据
.Where(谓词)
.OrderBy(GetCurrentOrderingField);
}
私有IComparable GetCurrentOrderingField(数据x)
{
开关(OrderByColumn)
{
案例“BookCategoryName”:
返回x.a.BookCategoryName;
案例“图书类别说明”:
返回x.a.图书类别说明;
}
返回x.a.CreatedOn;
}

当然,对于实现IComparable接口的字段,另一个选项是将排序字段选择本身提取到一个单独的方法中,如下所示:

public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate)
{
    return data
        .Where(predicate)
        .OrderBy(GetCurrentOrderingField);
}

private IComparable GetCurrentOrderingField(Data x)
{
    switch (OrderByColumn)
    {
        case "BookCategoryName":
            return x.a.BookCategoryName;

        case "BookCategoryDescription":
            return x.a.BookCategoryDescription;
    }

    return x.a.CreatedOn;
}
public IEnumerable SelectData(IEnumerable数据,Func谓词)
{
返回数据
.Where(谓词)
.OrderBy(GetCurrentOrderingField);
}
私有IComparable GetCurrentOrderingField(数据x)
{
开关(OrderByColumn)
{
案例“BookCategoryName”:
返回x.a.BookCategoryName;
案例“图书类别说明”:
返回x.a.图书类别说明;
}
返回x.a.CreatedOn;
}
当然,这适用于实现IComparable接口的字段