在EF6中建立有效的左半反连接

我一直在将一个长期使用的粗糙程序转换为EF,以使其更易于测试和维护。除以下部分外,大多数情况进展顺利:


select p.idProduct from products p

where

// {some random filtering bringing us down to a manageable number of rows}

AND p.idProduct NOT IN (SELECT idProduct from productsShipped)

我已经将其转换为:


        var results = dbc.products.Where(p =>

            p.warehouse == warehouse

            && p.BarConversion.Bar.BarDate > minDate

            && !dbc.productsShipped.Any(ps => ps.idInventory == p.idInventory)

            //&& p.productsShipped == null

            && p.OPR.Order.Payment != null

            && !(p.OPR.Order.PaymentType == 5 &&

                 (p.OPR.Order.Payment.paymentStatus == null ||

                  p.OPR.Order.Payment.paymentStatus != "accepted"))

            && p.OPR.Order.OrderSla.expectedShipDate <= dueDateCutoff);

我遇到的问题是,productsShipped表绝对是巨大的。在原始SQL中,where子句必须理解它不需要提取整个productsShipped表,而只提取与先前查询有关的产品。等效的EF将其分解为一个子查询,并询问productsShipped表中的每个条目,导致查询花费超过五分钟的时间,而没有此过滤器则需要花费几秒钟的时间。我尝试在两个实体之间添加具有相似结果的关系。


有没有一种方法可以强迫Entity进行适当的左外部排他联接而不是子查询或以类似方式提高性能,或者我是否不得不承受这种性能冲击或将我的部分逻辑推入难以测试的存储过程中?


守着一只汪
浏览 155回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP