【问题标题】:LINQ - Dynamic Order By ExpressionLINQ - 按表达式动态排序
【发布时间】:2014-12-05 11:24:28
【问题描述】:

我有一个小问题。目前,我正在尝试使用 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 Location = CustomerService.GetAllLocation();我正在尝试使用此列表值进行排序。

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


【解决方案1】:

使用

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

【讨论】:

  • 感谢您的回复。是的,索引是优先事项。解决方案#1 似乎没有正确执行订单。我与订单有差异,但适用于 linq 分页。解决方案#2 这对我有用。目前,我已经使用 skip and take 实现了 linq 分页。使用此代码,我最终从表中检索所有行并在其后实现 order。是否有可能通过字符串列表和 linq 分页来实现这两种排序?
  • @DuraiPandian:第一个只知道 1 或 0,所以你有两个组。后者按列表中项目的索引排序。由于 LINQ-TO-SQL 不支持这一点,我已将查询具体化为一个列表。但是由于首先应用了过滤器,因此性能应该是可以接受的(取决于匹配的数量)。 Skip and Take 也适用于 LINQ-TO-Objects(所以在 ToList 之后)。我还没有时间搜索在数据库中有效的方法,也许您需要先将其插入临时表中。
  • 非常感谢。后一种顺序对我来说非常有效。
【解决方案2】:

宁可将逻辑推到这样的方法中:

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

【讨论】:

  • 我收到异常“LINQ to Entities 无法识别方法 'Int32 GetOrder(LocationObject)' 方法,并且此方法无法转换为存储表达式。”另外,我在列表中有位置值,我试图在某种程度上循环以通过查询生成订单。
  • LocationObject 作为一个类型意味着作为t 实际类型的占位符(您从未在代码中指定它)。
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2011-11-22
相关资源
最近更新 更多