簡體   English   中英

從一種類型的集合復制到另一種c#的最快方法

[英]fastest way to copy from a collection of one type to another c#

我得到的業務實體(表數據)的集合大約等於49000。 我正在嘗試使用Add方法將某些值從此集合復制到anothr集合並手動將值添加到其屬性

例如,//返回arounf 49000 VendorProduct集合,它引用表VendorProduct中的數據

List<VendorProduct> productList = GetMultiple(req); 

foreach (VendorProduct item in productList)
            {
                VendorSearchProductWrapper wrapperItem = new VendorSearchProductWrapper();
                IEnumerable<ClientProductPreference> prodPrefClient = item.ClientProductPreferences.Where(e => (e.VendorProductId.Equals(item.Id)
                    && (e.AccountId.Equals(SuiteUser.Current.AccountId))));
                if (prodPrefClient.Count() == 1)
                {
                    foreach (ClientProductPreference it in prodPrefClient)
                    {
                        wrapperItem.ClientProdID = it.Id;
                        wrapperItem.ClientProductDescription = it.Description;
                        wrapperItem.MarkupPct = it.MarkUpPct;
                        wrapperItem.SalesPrice = it.SalesPrice;
                    }
                }
                wrapperItem.Code = item.Code;
                wrapperItem.ListPrice = item.ListPrice;
                wrapperItem.Id = item.Id;
                wrapperItem.DiscountPct = ValueParser.SafeDecimal(item.Discount, null);
                wrapperItem.Discountgroup = item.DiscountGroup.DiscountGroup;
                wrapperItem.Description = item.Description;
                wrapperItem.Unit = item.Unit;
                wrapperItem.ClientName = item.Account.ClientName;
                products.Add(wrapperItem);
            }

要復制所有這49000條記錄需要花費大量時間。實際上5分鍾,只有100-200條記錄被添加到列表中。

我需要在大約1分鍾內更快地復制這些值。

提前致謝

弗朗西斯·P。

IEnumerable<ClientProductPreference> prodPrefClient = item.ClientProductPreferences.Where(e     => (e.VendorProductId.Equals(item.Id)
                && (e.AccountId.Equals(SuiteUser.Current.AccountId))));
            if (prodPrefClient.Count() == 1)
            {
                foreach (ClientProductPreference it in prodPrefClient)
                {

這段代碼有很多錯誤。

  1. 嘗試將此值檢索為SingleOrDefault,然后檢查NULL。 您這樣做的方式是對相同數據進行兩次TWICE迭代。 首先獲取計數,其次在foreach中進行迭代(這也沒有用,因為您知道collection只有1個項目,並且為一個項目創建整個迭代器是很瘋狂的)

  2. 可以使用某種詞典嗎?

  3. 檢查延遲加載。 當您知道需要數據(我看到您需要它們)時,就應該急於加載它們以減少數據庫調用的數量。

  4. 最好的方法是進行專用的SQL(或LINQ,因為它很簡單)查詢,該查詢將在DB上完全執行。 這將是最快的解決方案。

即使使用您的代碼,這也應該更快地發生。 您確定其中沒有冗長的操作嗎? 例如。 延遲加載,其他數據調用,...

即使很小的變量也可以對49000迭代產生重大影響

我同意@Bertvan。 迭代不應該花費那么多時間(即使記錄為49K)。

我建議考慮以下幾行(這可能會造成問題):

if (prodPrefClient.Count() == 1)  

不知道您要在這里實現什么,但是此調用正在迭代一個惰性集合。 請考慮是否需要此檢查。

wrapperItem.DiscountPct = ValueParser.SafeDecimal(item.Discount, null); 

整數/雙精度比較器確實會占用一些處理時間。 您還應該通過刪除此行代碼來檢查操作所花費的總時間。

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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