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();

我正在尝试使用此列表值进行排序。是否可以通过使用包含列值的列表来实现动态顺序?

LINQ - 按表达式动态排序

使用

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;
}