微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选择FROM子查询,而无需从另一个上下文对象开始

如何解决选择FROM子查询,而无需从另一个上下文对象开始

我正在尝试对以下要在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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。