медленный выбор списка linq - PullRequest
0 голосов
/ 27 сентября 2019

выбор происходит медленно, когда я пытаюсь включить закомментированную часть кода (5 минут для извлечения 21k строк).

Могу ли я что-нибудь сделать, чтобы улучшить производительность моего кода

 var q = db.Storages.Where(x => x.LocationID == lngID && x.IsStored == true && x.Item.isInUse == false).ToList();


                if (q.Count() > 0)
                {

                    List<StorageMdl> lst = q.Select(x => new StorageMdl
                    {
                        lngID = x.ID,
                        strItemID = x.ItemID,
                        lngLocationID = x.LocationID,
                        itmMdl = new ItemMdl
                        {
                            strID = x.ID
                            //strBarCode = x.Item.Barcode,
                            //strColor = x.Item.Color,
                            //bolIsInUse = x.Item.isInUse,
                            //bolIsActive = x.Item.isActive,
                            //dteCreateDate = x.Item.CreateDate.Value,
                            //strDisposalRefNo = x.Item.DisposalRefNo,
                            //strCreatedBy = x.Item.CreatedBy,
                            ////dteDisposalDate = x.Item.DisposalDate.GetValueOrDefault(),
                            //itMdl = new ItemTypeMdl
                            //{
                            //    lngID = x.Item.ItemType.ID,
                            //    strName = x.Item.ItemType.Name,
                            //    bolHasBarcode = x.Item.ItemType.hasBarcode,
                            //    bolHasManyColors = x.Item.ItemType.hasManyColor,
                            //    strCreatedBy = x.Item.ItemType.CreatedBy,
                            //    dteCreateDate = x.Item.ItemType.CreateDate.HasValue ? (DateTime)x.Item.ItemType.CreateDate : new DateTime(),
                            //    bolIsActive = x.Item.ItemType.isActive
                            //},
                            //strITName = x.Item.ItemType.Name,
                            //strManufacturer = x.Item.Manufacturer,
                            //strDescription = x.Item.Description
                        },
                        bolIsStored = x.IsStored.HasValue ? (bool)x.IsStored : false,
                        strStoredBy = x.StoredBy,
                        strApprovedStoreBy = x.ApproveStoreBy,
                        dteStoredDate = x.StoreDate,
                        dteItemOut = x.ItemOutDate.HasValue ? (DateTime)x.ItemOutDate : new DateTime(),
                        strItemOutBy = x.ItemOutApproveBy
                    }).ToList();

Заранее спасибо.:)

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Проблема может заключаться в обращении к базе данных, которую вы выбираете вторым для навигационных свойств (т. Е. X.Item или x.Item.ItemType), совершая несколько обращений к базе данных, вызывая медленный запрос. Попробуйте запуститьвесь запрос перед вызовом .toList ()

Я не совсем уверен насчет нулевых типов в таблице хранения, но идея такова:

List<StorageMdl> lst = db.Storages.Where(x => x.LocationID == lngID && x.IsStored == true && x.Item.isInUse == false)
                  .Select(x => new StorageMdl
                    {
                        lngID = x.ID,
                        strItemID = x.ItemID,
                        lngLocationID = x.LocationID,
                        itmMdl = new ItemMdl
                        {
                            strID = x.ID
                            strBarCode = x.Item.Barcode,
                            strColor = x.Item.Color,
                            bolIsInUse = x.Item.isInUse,
                            bolIsActive = x.Item.isActive,
                            dteCreateDate = x.Item.CreateDate.Value,
                            strDisposalRefNo = x.Item.DisposalRefNo,
                            strCreatedBy = x.Item.CreatedBy,
                            dteDisposalDate = x.Item.DisposalDate!=null ? x.Item.DisposalDate.Value : DateTime.MinValue,
                            itMdl = new ItemTypeMdl
                            {
                                lngID = x.Item.ItemType.ID,
                                strName = x.Item.ItemType.Name,
                                bolHasBarcode = x.Item.ItemType.hasBarcode,
                                bolHasManyColors = x.Item.ItemType.hasManyColor,
                                strCreatedBy = x.Item.ItemType.CreatedBy,
                                dteCreateDate = x.Item.ItemType.CreateDate!=null ? x.Item.ItemType.CreateDate.Value : DateTime.MinValue,
                                bolIsActive = x.Item.ItemType.isActive
                            },
                            strITName = x.Item.ItemType.Name,
                            strManufacturer = x.Item.Manufacturer,
                            strDescription = x.Item.Description
                        },
                        bolIsStored = x.IsStored!=null ? x.IsStored.Value : false,
                        strStoredBy = x.StoredBy,
                        strApprovedStoreBy = x.ApproveStoreBy,
                        dteStoredDate = x.StoreDate,
                        dteItemOut = x.ItemOutDate!=null ? x.ItemOutDate.Value : DateTime.MinValue,
                        strItemOutBy = x.ItemOutApproveBy
                    }).ToList();
0 голосов
/ 30 сентября 2019

Я преобразовал свой предыдущий код в

                if (q.Count() > 0)
                {
                    List<StorageMdl> a = db.Storages.Where(x => x.LocationID == lngID && x.IsStored == true && x.Item.isInUse == false)
                                           .Select(x => new StorageMdl
                                           {
                                               lngID = x.ID,
                                               strItemID = x.ItemID,
                                               lngLocationID = x.LocationID,
                                               itmMdl = new ItemMdl
                                               {
                                                   strID = x.ID,
                                                   strBarCode = x.Item.Barcode,
                                                   strColor = x.Item.Color,
                                                   bolIsInUse = x.Item.isInUse,
                                                   bolIsActive = x.Item.isActive,
                                                   dteCreateDate = x.Item.CreateDate.Value,
                                                   strDisposalRefNo = x.Item.DisposalRefNo,
                                                   strCreatedBy = x.Item.CreatedBy,
                                                   dteDisposalDate = x.Item.DisposalDate,
                                                   itMdl = new ItemTypeMdl
                                                   {
                                                       lngID = x.Item.ItemType.ID,
                                                       strName = x.Item.ItemType.Name,
                                                       bolHasBarcode = x.Item.ItemType.hasBarcode,
                                                       bolHasManyColors = x.Item.ItemType.hasManyColor,
                                                       strCreatedBy = x.Item.ItemType.CreatedBy,
                                                       dteCreateDate = x.Item.ItemType.CreateDate ?? DateTime.Now,
                                                       bolIsActive = x.Item.ItemType.isActive
                                                   },
                                                   strITName = x.Item.ItemType.Name,
                                                   strManufacturer = x.Item.Manufacturer,
                                                   strDescription = x.Item.Description
                                               },
                                               bolIsStored = x.IsStored ?? false,
                                               strStoredBy = x.StoredBy,
                                               strApprovedStoreBy = x.ApproveStoreBy,
                                               dteStoredDate = x.StoreDate,
                                               dteItemOut = x.ItemOutDate ?? DateTime.Now,
                                               strItemOutBy = x.ItemOutApproveBy
                                           }).ToList();
                    retVal.Add("exitCode", 1);
                    retVal.Add("list", lststored);
                }

, и он пошел быстрее, чем раньше.

Спасибо за вашу помощь.:)

0 голосов
/ 27 сентября 2019

Я не уверен в том, как вы извлекаете свои данные (например, какая система баз данных, ORM и все такое в действии).Но из того, что я вижу, у вас может быть проблема n + 1.

Закомментированный код действительно получает доступ к свойству Item вашего Storage объекта.Он также получает доступ к свойству ItemType объекта Item.Может быть, ваш ORM (или что-то еще) выполняет ленивую загрузку.Это означает, что он выдает запрос БД для каждого создаваемого вами объекта.Это приведет к очень плохой производительности.Может быть, вы приложите какой-нибудь профилировщик и проанализируете фактические запросы к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...