获取和过滤 iqueryable 对象内的多个类

Posted

技术标签:

【中文标题】获取和过滤 iqueryable 对象内的多个类【英文标题】:Get and filter multiple classes inside of iqueryable object 【发布时间】:2021-10-04 16:08:32 【问题描述】: 我不知道如何让这个查询工作! 我需要创建可查询的订单列表,并仅从 OrderState 类中选择 StateId 等于所需数量的订单 这是我的模型课程!
public class Order

    public virtual ICollection<OrderState> OrderState  get; set;        


public class OrderState

    public int OrderStateId get;set;
    public int OrderIdget;set;
    public int StateIdget;set;
    public virtual ICollection<State> State  get; set;        


public partial class State

    public int StateIdget;set;
    public string Name get; set; 

这是我的代码
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.StateId!=0)

//query =get every Order where StateId from Orderstate == search.StateId


var entities = query.ToList(); 
return _mapper.Map<List<Model.Order>>(entities);
任何帮助表示赞赏! 感谢您尝试提供帮助!!!

【问题讨论】:

【参考方案1】:

所以 orderstate 列表是订单所在状态的历史记录?顺便说一句,如果 orderstate 表有更多列,比如订单转换到该状态的日期时间,它可能会更有用。Order 中的 orderstate 集合也应该称为 OrderStates 复数,因为它是一个集合。这样做会使代码更具可读性/自我描述性;复数本质上是说“你可以在我身上调用 LINQ 的东西”

无论如何,您可能想要“任何状态都是 X”

if(search.StateId!=0)

    query = query.Where(o => o.OrderStates.Any(os => os.StateId == search.StateId));

在 DB 上,这将转化为类似 FROM Orders o WHERE EXISTS(SELECT null FROM OrderStates os WHERE os.Id = o.Id AND os.StateId = @p1)

【讨论】:

以上是关于获取和过滤 iqueryable 对象内的多个类的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥我不能像使用列表一样过滤 IQueryable?

如何通过猫鼬(javascript)中的多个值查询数组内的对象?

我应该何时使用 IEnumerable 以及何时使用 IQueryable?

如何将数组内的对象和每个对象相乘,获取一个或多个键并减少它们的值?

建立 IQueryable 包括基于条件的附加表