Linq基于子表数据选择记录
尝试根据存储在另一个表中的订单的当前状态选择订单。继续获取所有订单,而不是按当前状态筛选的订单。当status不为空时,查询应该根据订单的最新状态进行过滤,我认为应该是status,按记录日期的降序排列,第一个状态为statusLinq基于子表数据选择记录,linq,linq-to-entities,Linq,Linq To Entities,尝试根据存储在另一个表中的订单的当前状态选择订单。继续获取所有订单,而不是按当前状态筛选的订单。当status不为空时,查询应该根据订单的最新状态进行过滤,我认为应该是status,按记录日期的降序排列,第一个状态为status private IQueryable<order_tbl> CreateQuery(string status, int? orderId, DateTime? orderDate) { var query = from o in context.o
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;
}
订单状态
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
仅在“打开”上搜索时,查询将返回订单1、2、3,而不仅仅是订单3。关于状态的查询有什么问题?这个答案为我指明了正确的方向 将我的查询修改为以下内容
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);
}
您正在执行从
查询
到状态
的交叉联接。这意味着您将获得一个q
和一个s
的组合对。如果存在任何具有匹配状态的s
,您将获得与该s
匹配的每个q
,然后将其缩小到每个q
。请注意,您没有将s
的范围缩小到匹配orderId
。您需要将q
连接到s
或在交叉连接上使用where
将q
与s
匹配。
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);
}