簡體   English   中英

Linq where 子句混淆

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM