проблема в поиске среднего для вложенного запроса linq - PullRequest
0 голосов
/ 03 мая 2020

Я реализую asp. net основной проект. И у меня есть несколько таблиц с именами ApiApp , ApiAppHistory и Entity .

  • В ApiApp таблица, у меня есть дата поле типа string (гггг / мм / дд) и поле ApplicantID.

  • В ApiAppHistory есть поле с именем LastReqStatus , которое имеет тип int, и его соответствующее значение хранится в Entity Таблица.

  • Теперь я хочу сгруппировать по Year, Month, LastReqStatus и ApplicantID, чтобы найти для каждого месяца из год на сколько ApplicantID LastReqStatus равно предоставлено .

  • И после нахождения этого я хочу узнать в среднем для каждого месяца года , что для всех ApplicantIDs * lastReqStatus == "Granted".

Для первого я написал запрос, подобный следующему:

var avg = from t1 in _context.Apiapp
          join t2 in _context.ApiAppHistory on t1.Id equals t2.ApiAppId
          join t3 in _context.Entity on t2.LastReqStatus equals t3.Id
          where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id && t3.Name == "Granted"
                group new {t1,t2}
                by new { t2.LastReqStatus, Year = t1.ApiRequestDate.Substring(0, 4), Month = t1.ApiRequestDate.Substring(5, 2) , Applicant = t1.ApplicantId } into g

                    select new
                             {

                                 Year = g.Key.Year, 
                                 Month = g.Key.Month,
                                 Applicant = g.Key.Applicant,
                                 GrantedCount = g.Count()
                             };

var GrantedReqAVG = avg.ToList(); 
public partial class ApiApplicantHistory
    {
        public int Id { get; set; }
        public int? SentType { get; set; }
        public int? Reason { get; set; }
        public int? LastReqStatus { get; set; }
        public int? ApiAppId { get; set; }

        public virtual Apiapp ApiApp { get; set; }
        public virtual EntityType LastReqStatusNavigation { get; set; }
        public virtual EntityType SentTypeNavigation { get; set; }
        public virtual EntityType ReasonNavigation { get; set; }
    }

 public partial class EntityType
    {
        public EntityType()
        {
ApiApplicantHistoryLastReqStatusNavigation = new HashSet<ApiApplicantHistory>();            ApiApplicantHistorySentTypeNavigation = new HashSet<ApiApplicantHistory>();
            ApiApplicantHistoryReasonNavigation = new HashSet<ApiApplicantHistory>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public string EntityKey { get; set; }

public virtual ICollection<ApiApplicantHistory> ApiApplicantHistoryLastReqStatusNavigation { get; set; }        public virtual ICollection<ApiApplicantHistory> ApiAppHistorySentTypeNavigation { get; set; }
        public virtual ICollection<ApiApplicantHistory> ApiAppHistoryReasonNavigation { get; set; }

    }
}

public partial class Apiapp
    {
        public Apiapp()
        {
            ApiApplicantHistory = new HashSet<ApiApplicantHistory>();
        }

        public int Id { get; set; }
public bool? IsDeleted { get; set; }

        public int? LastRequestStatus { get; set; }
        public int ApplicantID { get; set; }
        public string ApiRequestDate { get; set; }
        public virtual ICollection<ApiApplicantHistory> ApiApplicantHistory { get; set; }
    }

Но по поводу нахождения среднего у меня нет никакого мнения, как я могу сделай это. Я буду признателен, если кто-нибудь поможет мне.
Для экземпляра у меня есть следующие данные в таблице ApiApp :
ApiApp:

ID:1 LastRequestStatus:1 ApplicantID:1 ApiRequestDate:2019/02/03
ID:2 LastRequestStatus:2 ApplicantID:1 ApiRequestDate:2019/02/16

ID:3 LastRequestStatus:10 ApplicantID:2 ApiRequestDate:2019/02/01
ID:4 LastRequestStatus:19 ApplicantID:2 ApiRequestDate:2019/02/20
ID:5 LastRequestStatus:31 ApplicantID:2 ApiRequestDate:2019/02/29

Таким образом, среднее значение должно быть:

(2 + 3) / 2 это означает, что 2 для ID: 1 и ID: 2 с тем же Заявителем # 1, который запросил в феврале и 3 месяца для ID: 3 и ID: 4 и ID : 5 с тем же кандидатом № 2, который запросил в феврале месяце, и потому, что в феврале месяце есть только два кандидата № 1 и № 2, поэтому мы должны разделить числитель на 2.

1 Ответ

1 голос
/ 05 мая 2020

После обновления:

1 - вам не нужно группировать по LastRequestStatus, просто Year, Month и ApplicantId

var groupedApplicant = from t1 in _context.Apiapp
                       join t2 in _context.ApiAppHistory on t1.Id equals t2.ApiAppId
                       join t3 in _context.Entity on t2.LastReqStatus equals t3.Id
                       where t1.IsDeleted == false && t1.LastRequestStatus == t2.Id && t3.Name == "Granted"
                       group new { t1, t2 }
                       by new { Year = t1.ApiRequestDate.Substring(0, 4), Month = t1.ApiRequestDate.Substring(5, 2), t1.ApplicantId } into g

                       select new
                       {
                           Year = g.Key.Year,
                           Month = g.Key.Month,
                           Applicant = g.Key.ApplicantId
                           GrantedCount = g.Count()
                       };

Этот запрос даст:

Year:2019,Month:2,Applicant:1,GrantedCount:2
Year:2019,Month:2,Applicant:2,GrantedCount:3

2 - Группировать groupedApplicant по Year и Month и выбрать среднее значение:

var avg = groupedApplicant
        .GroupBy(x => new { x.Year, x.Month })
        .Select(x => new { x.Key.Year, x.Key.Month, Avg = x.Average(y => y.GrantedCount) })
        .ToList();

Этот запрос даст:

Year:2019,Month:2,Avg:2.5

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

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