Как добавить группировку в сложный запрос linq? - PullRequest
1 голос
/ 29 мая 2019

В настоящее время у меня есть рабочий запрос, который извлекает данные из нескольких таблиц SQL для отображения в сетке пользовательского интерфейса kendo. Теперь мне было поручено добавить группировку в запрос, но я не смог успешно добавить группировку, которая будет возвращать данные. Все мои попытки до сих пор приводят к пустым наборам данных.

Я попытался добавить группу по выражению «group new {quotes, t, s, rfqStarred, ch} by new {quotes.QuoteExpirationTerm} в qgroup», что приводит к пустому набору данных. Я также не могу использовать какие-либо поля даты в запросе после добавления группировки.

По запросу возвращено более 100 полей, поэтому я удалил большинство, чтобы попытаться свести мой пример к минимуму.

Ниже приведен фрагмент рабочего запроса без группировки:

var query = from m in db.RfqQuoteIntermediates
            from quotes in db.Quotes.Where(q => q.Id == m.QuoteId).DefaultIfEmpty()
            from t in db.SEWPRfqs.Where(r => r.RfqId == m.RfqId).DefaultIfEmpty()
            from s in db.RfqSupplementals.Where(x => x.RfqSeqNumber == t.RfqSeqNumber).DefaultIfEmpty()
            from rfqStarred in db.RfqUserStarreds.Where(rs => rs.RfqSeqNumber == t.RfqSeqNumber && rs.SalesRep == salesrep).DefaultIfEmpty()
            let ch = db.RfqsChangeHistories.Where(r => r.RfqRfiSeqNum == t.RfqSeqNumber && (r.Action == "RFQ marked 'Hot'" || r.Action == "RFQ unmarked 'Hot'" || r.Action == "Quote Close Date Change" || r.Action == "Hot Change Comment" 
            || r.Action == "New Comment" || r.Action == "New RFQ Comment" || r.Action == "New Quote Comment" || r.Action == "Close Date Change Comment" || r.Action == "Stage Change Comment")).OrderByDescending(r => r.Id).FirstOrDefault()
            where (whereSelector == "allPipelineRfqs"
            || (whereSelector == "pipelineRfqs" && (quotes.QuoteStage == "Pipeline" || quotes.QuoteStage == "Swing" || quotes.QuoteStage == "Forecast"))
            || (whereSelector == "closedWon" && quotes.QuoteStage == "Closed-Won")
            || (whereSelector == "closedLost" && quotes.QuoteStage == "Closed-Lost")
            || (whereSelector == "today" && quotes.QuoteDate.Date >= today)
            || (whereSelector == "thisWeek" && startOfWeek <= quotes.QuoteDate && quotes.QuoteDate < endOfWeek)
            || (whereSelector == "lastWeek" && startOfWeek <= quotes.QuoteDate && quotes.QuoteDate < endOfWeek))
            && (isAdmin || t.assignedTo == salesrep || t.secndAssignedTo == salesrep || t.addlAssignedTo == salesrep || agencies.Contains(t.Agency))
            && t.IsDeleted == false && t.IsInPipeline
            select new PipelineDto()
            {
                RfqId = t.RfqId,
                Contract = t.Contract,
                RfqSeqNumber = t.RfqSeqNumber,

        .... fields removed for example

                IsInPipeline = t.IsInPipeline,
                VendorRationale = t.VendorRationale,
                LastUpdated = t.LastUpdated,
                Acronym = s.AgencyAcronym,
                SubAcronym = s.SubAgencyAcronym,
                userstarred = rfqStarred != null,
                QuoteId = quotes.Id,
                QuoteNumber = quotes.QuoteNumber,
                QuoteDate = quotes.QuoteDate.ToShortDateString(),
                QuoteSalesContact = quotes.QuoteSalesContact,
                QuotedBy = quotes.QuotedBy,
                QuoteTotal = quotes.QuoteTotal,
                QuoteExpirationTerm = quotes.QuoteExpirationTerm,
                ActionInfo = s.ActionInfo,
                AssignedDate = s.ActionInfoDate,
                CommentNotificationLastViewed = db.RfqCommentNotifications.Where(r => r.RfqSequenceNum == t.RfqSeqNumber && r.SalesRep == salesrep).Select(d=>d.LastViewed).SingleOrDefault(),
                CommentActionDate = ch.ActionDate,
                CommentAction = ch.Action,
                CommentActionBy = ch.ActionBy
            };

Вот что у меня есть в моей нерабочей группе по запросу:

var query = from m in db.RfqQuoteIntermediates
            from quotes in db.Quotes.Where(q => q.Id == m.QuoteId).DefaultIfEmpty()
            from t in db.SEWPRfqs.Where(r => r.RfqId == m.RfqId).DefaultIfEmpty()
            from s in db.RfqSupplementals.Where(x => x.RfqSeqNumber == t.RfqSeqNumber).DefaultIfEmpty()
            from rfqStarred in db.RfqUserStarreds.Where(rs => rs.RfqSeqNumber == t.RfqSeqNumber && rs.SalesRep == salesrep).DefaultIfEmpty()
            let ch = db.RfqsChangeHistories.Where(r => r.RfqRfiSeqNum == t.RfqSeqNumber && (r.Action == "RFQ marked 'Hot'" || r.Action == "RFQ unmarked 'Hot'" || r.Action == "Quote Close Date Change" || r.Action == "Hot Change Comment" 
            || r.Action == "New Comment" || r.Action == "New RFQ Comment" || r.Action == "New Quote Comment" || r.Action == "Close Date Change Comment" || r.Action == "Stage Change Comment")).OrderByDescending(r => r.Id).FirstOrDefault()
            where (whereSelector == "allPipelineRfqs"
            || (whereSelector == "pipelineRfqs" && (quotes.QuoteStage == "Pipeline" || quotes.QuoteStage == "Swing" || quotes.QuoteStage == "Forecast"))
            || (whereSelector == "closedWon" && quotes.QuoteStage == "Closed-Won")
            || (whereSelector == "closedLost" && quotes.QuoteStage == "Closed-Lost")
            || (whereSelector == "today" && quotes.QuoteDate.Date >= today)
            || (whereSelector == "thisWeek" && startOfWeek <= quotes.QuoteDate && quotes.QuoteDate < endOfWeek)
            || (whereSelector == "lastWeek" && startOfWeek <= quotes.QuoteDate && quotes.QuoteDate < endOfWeek))
            && (isAdmin || t.assignedTo == salesrep || t.secndAssignedTo == salesrep || t.addlAssignedTo == salesrep || agencies.Contains(t.Agency))
            && t.IsDeleted == false && t.IsInPipeline

            group new {quotes, t, s, rfqStarred, ch} by new {quotes.QuoteExpirationTerm} into qgroup

            select new PipelineDto()
            {
                RfqId = Convert.ToInt32(qgroup.Select(g => g.t.RfqId)),
                Contract = qgroup.Select(g => g.t.Contract).ToString(),
                RfqSeqNumber = qgroup.Select(g => g.t.RfqSeqNumber).ToString(),
                //RFQ_RFIDate = Convert.ToDateTime(qgroup.Select(g=>g.t.RFQ_RFIDate),   * everything below this wile not compile it I uncomment any of the dates. 
                BidStatus = qgroup.Select(g => g.t.BidStatus).ToString(),
                ModLevel = qgroup.Select(g => g.t.ModLevel).ToString(),
                //ModDate = Convert.ToDateTime(qgroup.Select(g=>g.t.ModDate)),      * same here and next field.
                //ReplyByDate = Convert.ToDateTime(qgroup.Select(g=>g.t.ReplyByDate),

        .... the rest of the fields

            };

Как выполнить группировку по кавычкам. QuoteExpirationTerm (int со значением 30, 60 или 90 дней), который будет возвращать данные и что мне нужно изменить в полях даты, чтобы иметь возможность включать даты в запрос.

Ожидаемые результаты - группировки по 30, 60 и 90 дням, но пока я могу получить только пустые наборы данных.

Может ли кто-нибудь указать мне правильное направление?

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