对 IQueryable 对象内的数据进行排序

Posted

技术标签:

【中文标题】对 IQueryable 对象内的数据进行排序【英文标题】:Sorting data inside of IQueryable object 【发布时间】:2021-09-19 21:22:55 【问题描述】:

我在对 IQueryable 变量中的数据进行排序时遇到问题。

我的代码不是英文的,所以我将模拟重要的代码。

我的Order 类有一个OrderState 类的实例,我的OrderState 类有一个State 类的实例。

public class Order

    public virtual ICollection<OrderState> OrderState  get; set; 


public class OrderState

    public int OrderStateId  get; set; 
    public int OrderId  get; set; 
    public int UserId  get; set; 
    public virtual ICollection<State> State  get; set; 


public partial class State

    public string Name get; set; 

在我的 API 服务类中,我想创建包含所有订单的列表,但每个订单仅上次创建 OrderState 类实例。我知道如何获取所有数据,但难以将 Orderstate 列表属性排序为只获取相关的OrderState。我需要使用IQueryable 列表。

这是我的 API 代码:

var query = _context.Set<Database.Order>().AsQueryable();

if (search.UserId != 0)

    query = query.Where(x => x.UserId == search.UserId);


if (search.OrderId != 0)

    query = query.Where(x => x.OrderId == search.OrderId);


if (search.LoadCurrentOrderState)

    // I don't know how to sort by orderstate desc and take only first item
    query = query.Include("OrderState").Include("OrderState.State");


var entities = query.ToList();

return _mapper.Map<List<Model.Order>>(entities);

感谢任何帮助!

感谢您的宝贵时间

【问题讨论】:

您使用的是 EF 还是 EF Core?指定确切的版本。 EF Core v5.0.5 , .net core 3.1 @AlexanderPetrov 【参考方案1】:

你很幸运:在 EF Core 5.0 中出现了Filtered include 功能。

query = query
    .Include(o => o.OrderState.OrderByDescending(os => os.OrderStateId).Take(1))
    .Include("OrderState.State");

这样的查询应该会给出想要的结果。Take(1) 返回第一项。

【讨论】:

以上是关于对 IQueryable 对象内的数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章