对 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 对象内的数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Android-java-如何按对象内的某个值对对象列表进行排序

在表格视图部分中对核心数据对象进行排序

DataSourceResult不在kendo-grid中进行分页,过滤和排序

向 IQueryable 添加扩展方法,该方法对列表进行分页并在从 API 控制器方法返回时返回 json 对象

使用 EF DbSet 对数据进行排序 [关闭]

js先后对某个js对象内的两个属性排序