[英]Linq where clause confusion
今天是個好日子!
我為我的自動化測試編寫了一個查詢,但是執行時間太長,而且我不確定如何有效地優化它,因為我是 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();
這里最大的代碼異味是您在Where
子句中調用其他存儲庫(假設存儲庫實際訪問數據庫)這實際上意味着您正在訪問每個查詢項目的數據庫。 讓我們想象一下OrderRepositoryX.GetOrderByStatus(OrderStatusType.Dispatched, 4000)
和第一個Where
將導致 1000 個項目,只有第二個Where
子句將導致對數據庫的 1000 次查詢(並且您在后續的Where
s 中有更多對存儲庫的調用)。 所有這一切都只得到一個項目(即FirstOrDefault
)。
通常的方法是避免在循環中調用數據庫( Where
基本上是什么)並重寫這樣的代碼,以便只對數據庫執行單個 SQL 查詢,只返回需要的內容並在數據庫端執行所有過濾。
請嘗試這樣做 避免使用過多的 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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.