LINQ - 按表达式动态排序
本文关键字:动态 排序 表达式 LINQ | 更新日期: 2023-09-27 18:33:23
我有一个小问题。 目前,我正在尝试使用 linq 通过查询编写动态顺序。
我正在尝试在linq中实现的SQL查询
select * from tbl
order by case when Location='Loc9787f85b-c953-4238-8bad-f712b6444443' then 1
when Location='Loc9787f85b-c953-4238-8bad-f712b6444442' then 2 end
位置值被检索并保存在列表中。它可以是一个或多个值。
此解决方案似乎适用于静态位置值。由于我动态检索位置值,我不知道如何实现动态位置值。
var temp = tbl.OrderBy(t => t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444443' ?
1 : (t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444442' ? 2 : 3))
我将使用以下一段代码检索位置:
List<String> Location = CustomerService.GetAllLocation();
我正在尝试使用此列表值进行排序。是否可以通过使用包含列值的列表来实现动态顺序?
使用
List<String> locations = CustomerService.GetAllLocation();
var ordered = tbl.OrderBy(t => locations.Contains(t.Location) ? 0 : 1);
或者,如果索引应表示优先级:
var ordered = tbl
.Where(t => locations.Contains(t.Location))
.ToList() //because List.IndexOf is not supported in LINQ-TO-SQL
.OrderBy(t => locations.IndexOf(t.Location));
而是将逻辑推送到这样的方法:
var temp = tbl.OrderBy(t => GetOrder(t));
public int GetOrder(LocationObject t)
{
int returnValue = 0;
if (t.Location== "Loc9787f85b-c953-4238-8bad-f712b6444443")
{
returnValue = 1;
}
else if (t.Location == "Loc9787f85b-c953-4238-8bad-f712b6444442")
{
returnValue = 2;
}
else
{
returnValue = 3;
}
return returnValue;
}