今天是個好日子!
我已經為我的自動化測驗撰寫了一個查詢,但執行時間太長,而且我不確定如何有效地優化它,因為我是 Linq where 子句的新手。
有人可以幫我解決這個問題嗎?
var order = OrderRepositoryX.GetOrderByStatus(OrderStatusType.Dispatched, 4000)
.Where(x => x.siteId == 1 || x.siteId == 10 || x.siteId == 8 || x.siteId == 16 || x.siteId == 26 || x.siteId == 27)
.Where(x =>
{
var totalPrice = OrderRepository.GetOrderById(shared_parameters.testConfiguration, x.orderId).TotalPrice;
if (totalPrice < 500)
return false;
return true;
})
.Where(x =>
{
var cnt = ReturnOrderRepositoryX.CheckReturnOrderExists(x.orderId);
if (cnt > 0)
return false;
return true;
})
.Where(x =>
{
var cnt = OrderRepositoryX.CheckActiveOrderJobDetailsByOrderId(x.orderId);
if (cnt > 0)
return false;
return true;
})
.FirstOrDefault();
uj5u.com熱心網友回復:
這里最大的代碼味道是您在Where子句中呼叫其他存盤庫(假設存盤庫實際上命中資料庫)這實際上意味著您正在為每個查詢的專案命中資料庫。讓我們想象一下,OrderRepositoryX.GetOrderByStatus(OrderStatusType.Dispatched, 4000)第一個Where將導致 1000 個專案,只有第二個Where子句將導致對資料庫的 1000 個查詢(并且您在隨后的Wheres 中有更多對存盤庫的呼叫)。而所有這一切只得到一個專案(即FirstOrDefault)。
通常的方法是避免在回圈中呼叫資料庫(Where這里基本上是這樣做的)并重寫此類代碼,以便僅對資料庫執行單個 SQL 查詢,僅回傳所需的內容并在資料庫端執行所有過濾。
uj5u.com熱心網友回復:
請試試這個 避免使用太多 where 子句。它得到一個結果,然后對整個集合應用另一個檢查。
var order = OrderRepositoryX.GetOrderByStatus(OrderStatusType.Dispatched, 4000)
.FirstOrDefault(x => x.siteId == 1 || x.siteId == 10 || x.siteId == 8 || x.siteId == 16 ||
x.siteId == 26 || x.siteId == 27) &&
(x =>
{
var totalPrice = OrderRepository.GetOrderById(shared_parameters.testConfiguration, x.orderId)
.TotalPrice;
return totalPrice >= 500;
})
&& (x =>
{
var cnt = ReturnOrderRepositoryX.CheckReturnOrderExists(x.orderId);
return cnt <= 0;
})
&& (x =>
{
var cnt = OrderRepositoryX.CheckActiveOrderJobDetailsByOrderId(x.orderId);
return cnt <= 0;
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399241.html
下一篇:AngularJs樣式多條件
