【发布时间】: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。状态查询有什么问题?
【问题讨论】:
-
您正在执行从
query到status的交叉连接。这意味着您将获得一个q和一个s的每个组合的对。如果存在任何具有匹配状态的s,您将获得与该s匹配的每个q,然后您将其缩小到每个q。请注意,您不会将s缩小到匹配orderId。您需要joinq到s或在交叉连接上使用where匹配q到s。
标签: linq linq-to-entities