Как читать данные из вложенного запроса select linq - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующий запрос типа linq.

var querymiangin = (from t1 in _context.Apiapplicant
                    join t2 in _context.ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
                    join t3 in _context.EntityType on t2.LastReqStatus equals t3.Id
                    where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id && t3.Name == "granted"
                    select new { A = t1, B = t2, Year = t1.ApiRequestDate.Substring(0, 4), Month = t1.ApiRequestDate.Substring(5, 2) } into joined
                    group joined by new { joined.Year, joined.Month, joined.B.LastReqStatus } into grouped
                    select grouped.Select(g => new { ApiReqDate = g.A.ApiRequestDate, ApiDate = g.B.Date, ApiLastReqStatus = g.B.LastReqStatus, ApiYear = g.Year, ApiMonth = g.Month })).ToList();

В части выбора ApiReqDate и ApiDate имеют несколько записей. Теперь моя проблема для каждой группы месяца и года, у меня есть несколько записей ApiDate и ApiReqDate, и я хочу для каждой группы на основе условия (t1.LastRequestStatus == t2.Id && t3.Name == "предоставлено") с использованием GetPersianDaysDiffDate (), получить разницу между ApiReqDate и соответствующими записями ApiDate за каждый месяц, а затем найти их среднее значение за этот месяц.

Для этого я написал такой код:

var avgDateDiff = querymiangin.DefaultIfEmpty()
       .GroupBy(x => new { x.ApiYear, x.ApiMonth }, (key, g) => new
       {
           key.ApiYear,
           key.ApiYear,
           Avg = g.Average(y => GetPersianDaysDiffDate(y.ApiReqDate,y.ApiDate))
       })
       .ToList();

Но проблема в том, что каждый параметр x.ApiYear, x.ApiMonth, y.ApiReqDate, y.ApiDate неизвестен, и он показывает мне ошибку. Буду признателен, если кто-нибудь может предложить мне решение этой проблемы.

1 Ответ

1 голос
/ 20 июня 2020

1 - Для первого запроса querymiangin вам не нужно group by оператор, немного измените код на:

var querymiangin = (from t1 in Apiapplicant
                    join t2 in ApiApplicantHistory on t1.Id equals t2.ApiApplicantId
                    join t3 in EntityType on t2.LastReqStatus equals t3.Id
                    where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id && t3.Name == "granted"
                    select new
                    {
                        ApiReqDate = t1.ApiRequestDate,
                        ApiDate = t2.Date,
                        ApiYear = t1.ApiRequestDate.Substring(0, 4),
                        ApiMonth = t1.ApiRequestDate.Substring(5, 2)
                    }).ToList();

2 - Для второго запроса avgDateDiff используйте GroupBy по ApiYear и ApiMonth и вычислите Average, например:

var avgDateDiff = querymiangin
       .GroupBy(x => new { x.ApiYear, x.ApiMonth }, (key, g) => new
       {
           key.ApiYear,
           key.ApiMonth,
           Avg = g.Average(y => GetPersianDaysDiffDate(y.ApiReqDate, y.ApiDate))
       }).ToList();

Надеюсь, вы найдете это полезным.

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