【发布时间】:2019-11-28 19:58:19
【问题描述】:
我有一个使用 GroupJoin 的 linq 查询,并且总是在本地评估导致命中 SQL 服务器 n 次,其中 n 是订单数。
我有 3 个表 Orders、OrderStatus、OrderStatusCode。
Orders has OrderId, CustomerId, ProductId
OrderStatus has OrderId, OrderStatusId, OrderStatusCodeId,
OrderStatusCode has OrderStatusCodeId, OrderStatusCodeName
OrderId, CustomerId, ProductId
1 5000 100
2 5400 100
OrderId, OrderStatusId, OrderStatusCodeId CreatedDateTime
1 1 1 -- started 12/01/2019
1 2 2 -- completed 12/01/2019
1 3 3 -- shipped 12/03/2019
2 1 1 -- started 12/01/2019
2 2 4 -- canceled 12/01/2019
2 3 5 -- refunded 12/10/2019
OrderStatusCodeId, OrderStatusCodeName
1 started
2 completed
3 shipped
4 canceled
5 refunded
var OrderWithLatestStatus = _dbContext.Orders.Include(h =>
h.OrderStatus).ThenInclude(hs => hs.OrderStatusCode)
.Where(o => o.ProductId == "100")
.GroupJoin(_dbContext.OrderStatus,
order => order.OrderId,
status => status.OrderId,
(o, g) => new
{
Order = o,
OrderStatuses = g
})
.Select(x => new EvalWithStatus
{
OrderId = x.Order.OrderId,
CustomerId = x.Order.CustomerId,
AllStatuses = x.OrderStatuses,
LatestOrderStatusCodeName = x.OrderStatuses.Any() ?
x.OrderStatuses.Any(s =>
s.OrderStatusCode.OrderStatusCodeName.Equals("Canceled"))
? x.OrderStatuses.FirstOrDefault(s =>
s.OrderStatusCode.OrderStatusCodeName.Equals("Canceled"))
.OrderStatusCode.OrderStatusCodeName :
x.OrderStatuses.OrderByDescending(s =>
s.CreatedDateTime).FirstOrDefault()
.OrderStatusCode.OrderStatusCodeName
: "Unknown"
}
在选择中,我希望最新状态显示已取消订单的已取消以及已完成项目的实际最新状态
OrderId, CustomerId, AllStatuses, LatestOrderStatusCodeName
1 5000 IEnuerable<OrderStatus> Shipped
2 5400 IEnuerable<OrderStatus> Canceled
linq 查询说它无法评估 x.OrderStatuses.Any(),因此它将在本地进行评估,从而导致对数据库的两次单独调用。
可以在查询中进行哪些更改以使其在服务器上进行评估?
【问题讨论】:
-
感谢您查看我的问题,如果有 100 个订单,我不希望它进入服务器 100 次,我可以更改什么以使其在服务器上运行
标签: c# .net linq .net-core linq-to-entities