Попытка извлечь данные из нескольких связанных таблиц в MySQL из очень больших данных - PullRequest
0 голосов
/ 07 января 2019

Я знаю, что этот вопрос задавался несколько раз, но я пытался получить данные из многих и многих связанных нескольких таблиц в таблице MySQL. Кроме того, каждая таблица содержит минимум 500000 записей. Как ускорить процесс извлечения данных в этом случае?

Хотя я пытался получить данные с помощью группировки, чтобы подготовить данные в соответствии с экраном, но он все еще работает очень медленно.

В контроллере экрана я использовал группу, используя linq.

var lstclientId = (from c in DBContext.groupmasters.Where(w => w.isactive == true && w.UserID == userid)
                   group c by c.ClientID into d
                   select new
                   {
                       clientID = d.Key,
                   });


var lstJobTypeID = (from c in DBContext.jobrequisitions.Where(w => w.ISActive == true)
                    group c by new { c.CreativeID, c.ProjectName, c.client.ClientName, c.brandmaster.branddesc } into d
                    select new
                    {
                        CreativeID = d.Key.CreativeID,
                        ProjectName = d.Key.ProjectName,
                        ClientName = d.Key.ClientName,
                        branddesc = d.Key.branddesc,
                    }).OrderBy(o => o.CreativeID);
List<jobrequisition> lstrequisition = new List<jobrequisition>();
List<jobrequisition> lstrequisitionusers = new List<jobrequisition>();
if ((Session["deptCode"]).ToString() == "QC" || (Session["deptCode"]).ToString() == "OP" || Convert.ToBoolean(Session["IsAdmin"]) == true)
{
    database2Entities JobEntities = new database2Entities();
    lstrequisition = JobEntities.jobrequisitions.Where(w => w.ISActive == true).ToList();
    lstrequisitionusers.AddRange(lstrequisition);
}
else
{
    foreach (var i in lstclientId)
    {
        database2Entities JobEntities = new database2Entities();
        lstrequisition = JobEntities.jobrequisitions.Where(w => w.ISActive == true && w.ClientID == i.clientID).ToList();
        lstrequisitionusers.AddRange(lstrequisition);
    }
}
Hashtable ht = new Hashtable();
int k = 0;
foreach (var i in lstJobTypeID)
{
    foreach (jobrequisition objRequestion in lstrequisitionusers.OrderBy(o => o.CreativeID))
    {
        if (objRequestion.CreativeID == i.CreativeID)
        {
            database2Entities ArtContext = new database2Entities();
            database2Entities SubArtContext = new database2Entities();
            if (lstArtWorkReqID.Count() == 0)
            {

                ///old code... 
                var lstArt = ArtContext.artworkrequisitions.SqlQuery("SELECT *, count(ArtWorkName) as awtname FROM artworkrequisition as awt group by ArtWorkID having CreativeID = '" + i.CreativeID + "' and IsActive = 1").ToList();
                foreach (artworkrequisition art in lstArt)
                {
                    int isCompletedcount = 0, assigncount = 0, allitemcount = 0, jobassignedcount = 0, iscompletedjobcount = 0;
                    List<artworkrequisition> allartworkitems = SubArtContext.artworkrequisitions.Where(w => w.ArtWorkID == art.ArtWorkID && w.IsActive == true).ToList();
                    jobassignedcount = allartworkitems.Where(w => w.isAssigned == true).Count();
                    allitemcount = allartworkitems.Where(w => w.IsActive == true).Count();
                    if (jobassignedcount > 0)
                    {
                        if (jobassignedcount <= allitemcount)
                        {
                            foreach (artworkrequisition singleartitem in allartworkitems)
                            {
                                if (singleartitem.isAssigned == null && singleartitem.isAssigned == true)
                                {
                                    job_assigned_employee allocatedjobdetails = SubArtContext.job_assigned_employee.Where(w => w.ItemJobReqID == singleartitem.Id && w.JobTypeID == 1 && w.JobReqNo == singleartitem.ArtWorkID && w.IsActive == true).FirstOrDefault();
                                    if (allocatedjobdetails.IsCompelete == true)
                                    {
                                        iscompletedjobcount += 1;
                                    }
                                }
                            }
                            if (iscompletedjobcount < allitemcount)
                            {
                                lstArtWorkReqID.Add(art);
                            }

                        }
                    }
                    else
                    {
                        lstArtWorkReqID.Add(art);
                    }
                }



            }
            else
            {
                var lstArt = ArtContext.artworkrequisitions.SqlQuery("SELECT *, count(ArtWorkName) awtname FROM artworkrequisition awt group by ArtWorkID having CreativeID = '" + i.CreativeID + "' and IsActive = 1").ToList();
                foreach (artworkrequisition art in lstArt)
                {
                    int isCompletedcount = 0, assigncount = 0, allitemcount = 0, jobassignedcount = 0, iscompletedjobcount = 0;
                    List<artworkrequisition> allartworkitems = SubArtContext.artworkrequisitions.Where(w => w.ArtWorkID == art.ArtWorkID && w.IsActive == true).ToList();
                    jobassignedcount = allartworkitems.Where(w => w.isAssigned == true).Count();
                    allitemcount = allartworkitems.Where(w => w.IsActive == true).Count();
                    if (jobassignedcount > 0)
                    {
                        if (jobassignedcount <= allitemcount)
                        {
                            foreach (artworkrequisition singleartitem in allartworkitems)
                            {
                                if (singleartitem.isAssigned != null && singleartitem.isAssigned == true)
                                {
                                    job_assigned_employee allocatedjobdetails = SubArtContext.job_assigned_employee.Where(w => w.ItemJobReqID == singleartitem.Id && w.JobTypeID == 1 && w.JobReqNo == singleartitem.ArtWorkID && w.IsActive == true).FirstOrDefault();
                                    if (allocatedjobdetails != null)
                                    {
                                        if (allocatedjobdetails.IsCompelete != null && allocatedjobdetails.IsCompelete == true)
                                        {
                                            iscompletedjobcount += 1;
                                        }
                                    }
                                }
                            }
                            if (iscompletedjobcount <= jobassignedcount && iscompletedjobcount != allitemcount)
                            {
                                lstArtWorkReqID.Add(art);
                            }
                        }
                    }
                    else
                    {
                        lstArtWorkReqID.Add(art);
                    }

                    //         job_assigned_employee allocatedjobdetails = SubArtContext.job_assigned_employee.Where(w => w.ItemJobReqID == singleartitem.Id && w.JobTypeID == 1 && w.JobReqNo == singleartitem.ArtWorkID && w.IsActive == true).FirstOrDefault();

                }
            }
            if (lstPhotoStockReq.Count() == 0)
            {
                var lstPhotoStock = ArtContext.photographyrequisitions.SqlQuery("SELECT * FROM photographyrequisition where CreativeNo = '" + i.CreativeID + "' and isActive = 1  and isApproved = 0 group by photographyReqNo").ToList();
                foreach (photographyrequisition objphot in lstPhotoStock)
                {
                    lstPhotoStockReq.Add(objphot);
                }

            }
            else
            {
                var lstPhotoStock = ArtContext.photographyrequisitions.SqlQuery("SELECT * FROM photographyrequisition where CreativeNo = '" + i.CreativeID + "' and isActive = 1  and isApproved = 0 group by photographyReqNo").ToList();
                foreach (photographyrequisition objphot in lstPhotoStock)
                {
                    lstPhotoStockReq.Add(objphot);
                }
            }
            if (lstInterActiveWorkReq.Count() == 0)
            {
                var lstinteractivereq = ArtContext.interactiverequisitions.SqlQuery("SELECT * FROM interactiverequisition where CreativeID = '" + i.CreativeID + "' and isActive = 1 group by InteractiveID").ToList();
                foreach (interactiverequisition objInter in lstinteractivereq)
                {
                    lstInterActiveWorkReq.Add(objInter);
                }

            }
            else
            {
                var lstinteractivereq = ArtContext.interactiverequisitions.SqlQuery("SELECT * FROM interactiverequisition where CreativeID = '" + i.CreativeID + "' and isActive = 1 group by InteractiveID").ToList();
                foreach (interactiverequisition objInter in lstinteractivereq)
                {
                    lstInterActiveWorkReq.Add(objInter);
                }
            }
            if (lstTransWorkReq.Count() == 0)
            {
                var lstTranslatereq = ArtContext.translationrequisitions.SqlQuery("SELECT * FROM translationrequisition where creativeID = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by TransReqNo").ToList();
                foreach (translationrequisition objTrans in lstTranslatereq)
                {
                    lstTransWorkReq.Add(objTrans);
                }
            }
            else
            {
                var lstTranslatereq = ArtContext.translationrequisitions.SqlQuery("SELECT * FROM translationrequisition where creativeID = '" + i.CreativeID + "' and isActive = 1  and isApproved = 0 group by TransReqNo").ToList();
                foreach (translationrequisition objTrans in lstTranslatereq)
                {
                    lstTransWorkReq.Add(objTrans);
                }
            }
            if (lstPrintProductionReq.Count() == 0)
            {
                var lstPrintProductReq = ArtContext.printproductionrequisitions.SqlQuery("SELECT * FROM printproductionrequisition where CampaingNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by PrintProductionReqID").ToList();
                foreach (printproductionrequisition objPrint in lstPrintProductReq)
                {
                    lstPrintProductionReq.Add(objPrint);
                }
            }
            else
            {
                var lstPrintProductReq = ArtContext.printproductionrequisitions.SqlQuery("SELECT * FROM printproductionrequisition where CampaingNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by PrintProductionReqID").ToList();
                foreach (printproductionrequisition objPrint in lstPrintProductReq)
                {
                    lstPrintProductionReq.Add(objPrint);
                }
            }

            if (lstFilmProductionReq.Count() == 0)
            {
                var lstFilmproductionReq = ArtContext.filmproductionrequisitions.SqlQuery("SELECT * FROM filmproductionrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by FilmProductionReqID").ToList();
                foreach (filmproductionrequisition objFilm in lstFilmproductionReq)
                {
                    lstFilmProductionReq.Add(objFilm);
                }
            }
            else
            {
                var lstFilmproductionReq = ArtContext.filmproductionrequisitions.SqlQuery("SELECT * FROM filmproductionrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by FilmProductionReqID").ToList();
                foreach (filmproductionrequisition objFilm in lstFilmproductionReq)
                {
                    lstFilmProductionReq.Add(objFilm);
                }
            }

            if (lstRetainerFeeReq.Count() == 0)
            {
                var lstRetainerfeereq = ArtContext.retainerfeerequisitions.SqlQuery("SELECT * FROM retainerfeerequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by RetainerfeeReqID").ToList();
                foreach (retainerfeerequisition objRetainer in lstRetainerfeereq)
                {
                    lstRetainerFeeReq.Add(objRetainer);
                }
            }
            else
            {
                var lstRetainerfeereq = ArtContext.retainerfeerequisitions.SqlQuery("SELECT * FROM retainerfeerequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by RetainerfeeReqID").ToList();
                foreach (retainerfeerequisition objRetainer in lstRetainerfeereq)
                {
                    lstRetainerFeeReq.Add(objRetainer);
                }
            }

            if (lstStockImageReq.Count() == 0)
            {
                var lstStockImagereq = ArtContext.stockimagerequisitions.SqlQuery("SELECT * FROM stockimagerequisition where CampaginNo = '" + i.CreativeID + "' and IsActive = 1  and isApproved = 0 and statusId = 4 group by StockImageReqNo").ToList();
                foreach (stockimagerequisition objStockImage in lstStockImagereq)
                {
                    lstStockImageReq.Add(objStockImage);
                }
            }
            else
            {
                var lstStockImagereq = ArtContext.stockimagerequisitions.SqlQuery("SELECT * FROM stockimagerequisition where CampaginNo = '" + i.CreativeID + "' and IsActive = 1  and isApproved = 0 and statusId = 4 group by StockImageReqNo").ToList();
                foreach (stockimagerequisition objStockImage in lstStockImagereq)
                {
                    lstStockImageReq.Add(objStockImage);
                }
            }

            if (lstSystemWorkReq.Count() == 0)
            {
                var lstSystemWork = ArtContext.systemworkrequisitions.SqlQuery("SELECT * FROM systemworkrequisition where CampaignNo = '" + i.CreativeID + "' and IsActive = 1 and StatusID = 4 group by SystemReqNo").ToList();
                foreach (systemworkrequisition systemwork in lstSystemWork)
                {
                    lstSystemWorkReq.Add(systemwork);
                }
            }
            else
            {
                var lstSystemWork = ArtContext.systemworkrequisitions.SqlQuery("SELECT * FROM systemworkrequisition where CampaignNo = '" + i.CreativeID + "' and IsActive = 1 and StatusID = 4 group by SystemReqNo").ToList();
                foreach (systemworkrequisition systemwork in lstSystemWork)
                {
                    lstSystemWorkReq.Add(systemwork);
                }
            }

            if (lstOthersReq.Count() == 0)
            {
                var lstOthersreq = ArtContext.othersrequisitions.SqlQuery("SELECT * FROM othersrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by OtherReqNo").ToList();
                foreach (othersrequisition objOthers in lstOthersreq)
                {
                    lstOthersReq.Add(objOthers);
                }
            }
            else
            {
                var lstOthersreq = ArtContext.othersrequisitions.SqlQuery("SELECT * FROM othersrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by OtherReqNo").ToList();
                foreach (othersrequisition objOthers in lstOthersreq)
                {
                    lstOthersReq.Add(objOthers);
                }
            }


            if (lstTenderReq.Count() == 0)
            {
                var lstTendersreq = ArtContext.tender_noticerequisition.SqlQuery("SELECT *, count(TenderNoticeName) as tendername FROM tender_noticerequisition as awt group by tendernoticeID having CampaignNo = '" + i.CreativeID + "' and IsActive = 1").ToList();
                foreach (tender_noticerequisition objTenders in lstTendersreq)
                {
                    lstTenderReq.Add(objTenders);
                }
            }
            else
            {
                var lstTendersreq = ArtContext.tender_noticerequisition.SqlQuery("SELECT *, count(TenderNoticeName) as tendername FROM tender_noticerequisition as awt group by tendernoticeID having CampaignNo = '" + i.CreativeID + "' and IsActive = 1").ToList();
                foreach (tender_noticerequisition objTenders in lstTendersreq)
                {
                    lstTenderReq.Add(objTenders);
                }
            }


            if (lstillustrationreq.Count() == 0)
            {
                var lstillustrareq = ArtContext.illustrationrequisitions.SqlQuery("SELECT *,count(descriptions) FROM illustrationrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by IllustrationNo").ToList();
                foreach (illustrationrequisition objillustra in lstillustrareq)
                {
                    lstillustrationreq.Add(objillustra);
                }
            }
            else
            {
                var lstillustrareq = ArtContext.illustrationrequisitions.SqlQuery("SELECT * FROM illustrationrequisition where CampaignNo = '" + i.CreativeID + "' and isActive = 1 and isApproved = 0 group by IllustrationNo").ToList();
                foreach (illustrationrequisition objillustra in lstillustrareq)
                {
                    lstillustrationreq.Add(objillustra);
                }
            }

            string strprojectClient = i.ProjectName + "-" + i.ClientName + "-" + i.branddesc;
            ht.Add(i.CreativeID, strprojectClient);
            k++;
            break;
        }
    }
}

Я могу получить такие данные

№ кампании: 100001 -> № вакансии: 1001 Дата поступления: 28-03-2019

1 Ответ

0 голосов
/ 07 января 2019

Я думаю, что если вы измените:

from c in DBContext.jobrequisitions.Where(w => w.ISActive == true)

что-то вроде

from c in DBContext.jobrequisitions
where c.ISActive == true

Вы могли бы немного улучшить производительность, потому что, насколько я помню, свободная версия Where будет выполняться как отдельный запрос к базе данных, а не как часть группы по запросу, в результате чего база данных будет создать менее эффективный план выполнения.

Кстати, в качестве примечания я бы рекомендовал не смешивать синтаксис запросов SQL и свободно распространяемых запросов LINQ, если это не является абсолютно необходимым.

Надеюсь, это поможет!

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