我想获得以下功能。但由于我必须返回不同的数据类型,因此不允许使用该方法。在这种情况下我会做什么?
.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;
});
或获得此功能的任何其他建议?
答案 0 :(得分:3)
我建议你改变你的逻辑来构建查询,而不是在lambda中创建这样的逻辑:
之前构建查询:
var query = list.Where(...);
if(OrderByColumn=="BookCategoryName")
{
query = query.OrderBy(x=>x.a.BookCategoryName);
}
....
最后:
var result = query.ToList(); //for e.g.
它可以按你的需要工作,看起来更干净
答案 1 :(得分:1)
对于当前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 "";
});
(当然,常量值可以移出为实常数或变量等,但我想让上面的代码段自包含)
答案 2 :(得分:1)
,另一个选择是将排序字段选择本身提取到一个单独的方法,如下所示:
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;
}
当然,这适用于实现 IComparable 接口的字段。