【问题标题】:Linq select a record based on child table dataLinq 根据子表数据选择一条记录
【发布时间】:2025-12-20 05:40:06
【问题描述】:

尝试根据存储在另一个表中的当前状态选择订单。继续获取所有订单,而不是按当前状态过滤的订单。当状态不为空时,查询应根据订单的最新状态进行过滤,我认为应该是按记录日期降序排列的状态,采用第一个状态。

private IQueryable<order_tbl> CreateQuery(string status, int? orderId, DateTime? orderDate) {
    var query = from o in context.order_tbl select o;

    if (orderId.HasValue) query = query.Where(w => w.id.Equals(orderId.Value));

    if (orderDate.HasValue) query = query.Where(w => w.OrderDate.Equals(orderDate.Value));

    if (!string.IsNullOrEmpty(status)) {
        query = (from q in query
                from s in q.order_status
                .OrderByDescending(o => o.DateStatusUpdated)
                .Take(1)
                .Where(w => w.Status.Equals(status))
                select q);
    }

    return query;
}

为简洁起见,我在表格中省略了更多字段。

order_tbl

id    date    customerId
1    2/1/2018      6
2    2/3/2018      5
3    2/6/2018      3

订单状态

id    orderId    DateStatusUpdated   status
1        1         2/1/2018           open
2        1         2/2/2018           filled
3        2         2/3/2018           open
4        2         2/4/2018           filled
5        3         2/6/2018           open

仅在“open”上搜索时,查询将返回订单 1、2、3,而不是仅返回订单 3。状态查询有什么问题?

【问题讨论】:

  • 您正在执行从querystatus 的交叉连接。这意味着您将获得一个q 和一个s 的每个组合的对。如果存在任何具有匹配状态的s,您将获得与该s 匹配的每个q,然后您将其缩小到每个q。请注意,您不会将 s 缩小到匹配 orderId。您需要 join qs 或在交叉连接上使用 where 匹配 qs

标签: linq linq-to-entities


【解决方案1】:

这个答案为我指明了正确的方向,LINQ Query - Only get Order and MAX Date from Child Collection

将我的查询修改为以下内容。

if (!string.IsNullOrEmpty(status)) {
{
    query = query
            .SelectMany(s => s.order_status
                              .OrderByDescending(o => o.DateStatusUpdated)
                              .Take(1)
                       )
            .Where(w => w.Status.Equals(status))
            .Select(s => s.order_tbl);
}

【讨论】: