LINQ - 按表达式动态排序

时间:2014-12-05 11:24:28

标签: c# linq asp.net-mvc-3 linq-to-sql

我有一点问题。目前,我正在尝试使用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();

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

2 个答案:

答案 0 :(得分:0)

而是将逻辑推送到类似的方法:

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

答案 1 :(得分:0)

使用

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