问题描述
我正在尝试对以下要在netCore 2.2-EF Core中复制的MSSQL查询进行建模:
SELECT
wonum,MIN(requestdate) AS startdate,MAX(requestdate) AS enddate,MIN(laborcode)
FROM
(
SELECT
wo.wonum,sw.requestdate,wo.wolablnk AS 'laborcode'
FROM
DB1.dbo.web_users wu INNER JOIN
DB2.dbo.workorder wo on
wu.laborcode = wo.wolablnk INNER JOIN
DB2.dbo.sw_specialrequest sw on
wo.wonum = sw.wonum
WHERE
wo.status in ('LAPPR','APPR','REC') AND
sw.requestdate > GETDATE()
) a
GROUP BY
wonum
ORDER by
我已经构建并运行了子查询部分,但这使我陷入僵局:
var workOrders = await _db1Context.Workorder
.Where(r => r.Status == "LAPPR" || r.Status == "APPR" || r.Status == "REC")
.ToListAsync();
var specialRequests = await _db2Context.SwSpecialRequest
.Where(r => r.Requestdate > DateTime.Now)
.ToListAsync();
var subQuery = (from webUser in webUsers
join workOrder in workOrders on webUser.Laborcode equals workOrder.Wolablnk
join specialRequest in specialRequests on workOrder.Wonum equals specialRequest.Wonum
orderby webUser.Laborcode,specialRequest.Requestdate,specialRequest.Wonum
select new { workOrder.Wonum,Laborcode = workOrder.Wolablnk,workOrder.Workorderid })
.ToList();
我不确定如何使用我构建的子查询来启动所需的查询,而且我不确定自己是否走在正确的轨道上。我看了另外两个例子,但我不明白。
任何人都可以阐明这个主题并提供帮助吗?
谢谢!
解决方法
编写与SQL相同的LINQ查询,并且不要与ToListAsync()
混合使用。在ToListAsync()
之后,查询被发送到服务器。同样,您应该只使用一个DbContext
进行此类查询。
var webUsers = _db1Context.Webuser;
var workOrders = _db1Context.Workorder
.Where(r => r.Status == "LAPPR" || r.Status == "APPR" || r.Status == "REC");
var specialRequests = _db1Context.SwSpecialRequest
.Where(r => r.Requestdate > DateTime.Now);
var subQuery =
from webUser in webUsers
join workOrder in workOrders on webUser.Laborcode equals workOrder.Wolablnk
join specialRequest in specialRequests on workOrder.Wonum equals specialRequest.Wonum
select new
{
workOrder.Wonum,Laborcode = workOrder.Wolablnk,specialRequest.Requestdate
};
var resultQuery =
from a in subQuery
group a by a.Wonum into g
select new
{
Wonum = g.Key,StartDate = g.Min(x => x.Requestdate),EndDate = g.Max(x => x.Requestdate),Laborcode = g.Min(x => x. Laborcode)
};
// final materialization
var result = await resultQuery.ToListAsync();