LINQ и Entity Framework, получить сумму связанных строк не сопоставленного столбца - PullRequest
0 голосов
/ 13 октября 2011

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

Моя модель проста:

У нас есть позиции:

  • сетевой разработчик

  • Java-разработчик

У нас есть заявители:

  • Луис
  • Джон
  • и т. Д.

У нас есть кандидаты на позицию

В этом столбце или свойстве я хочу знать, сколько человек подало заявкуна каждую позицию, в зависимости от статуса.Итак, в моем представлении mvc я хочу показать что-то вроде:

Позиция применена Принята Отклонено ... другой статус

.net разработчик 5 3 2

java developer 3 2 1

Реальная проблема здесь - это запрос linq, который я не очень опытный.

РЕДАКТИРОВАТЬ: я думаю, что мне нужно изменить, где должен быть закодирован запрос linq, я полагаю, что он должен быть вКласс ApplicantPosition вместо Position, я также изменил типы Position и Application на ICollection.

Пожалуйста, смотрите измененный код.

 public class Position
    {
        public int id { get; set; }

        [StringLength(20, MinimumLength=3)]
        public string name { get; set; }
        public int yearsExperienceRequired { get; set; }


    }

    public class Applicant
    {
        public int ApplicantId { get; set; }
        [StringLength(20, MinimumLength = 3)]
        public string name { get; set; }
        public string telephone { get; set; }
        public string skypeuser { get; set; }
        public ApplicantImage photo { get; set; }
    }

public class ApplicantPosition
{
    public virtual ICollection<Position> appliedPositions { get; set; }
    public virtual ICollection<Applicant> applicants { get; set; }
    public DateTime appliedDate { get; set; }
    public int StatusValue { get; set; }

    public Status Status
    {
        get { return (Status)StatusValue; }
        set { StatusValue = (int)value; }
    }

      [NotMapped]
    public int numberOfApplicantsApplied
    {
        get
        {
            var query = 
                from ap in appliedPositions 
                select new
                {
                    positionName = g.Key.name,
                    peopleApplied = g.Count(x => x.Status == Status.Applied),
                };
            return query.Count(); ---??
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Использовать прямой SQL с оператором PIVOT . Это действительно не относится к запросам Linq.

1 голос
/ 13 октября 2011

Вы можете вставить это в LINQPad как программу на C # и запустить.

public enum  Status
{
    Applied, 
    Accepted,
    Rejected
}

public class Position
{
    public int id { get; set; }
    public string name { get; set; }
}

public class Applicant
{
    public int ApplicantId { get; set; }
    public string name { get; set; }
}

public class ApplicantPosition
{
    public Position appliedPosition { get; set; }
    public Applicant applicant { get; set; }
    public DateTime appliedDate { get; set; }
    public Status Status { get; set; }
}


void Main()
{
    var p1 = new Position { id = 1, name = ".net developer" };
    var p2 = new Position { id = 2, name = "java developer" };

    var a1 = new Applicant { ApplicantId = 100, name = "Luis" };
    var a2 = new Applicant { ApplicantId = 200, name = "John" };

    var ap1 = new ApplicantPosition { appliedPosition = p1, applicant = a1, Status = Status.Applied };
    var ap2 = new ApplicantPosition { appliedPosition = p1, applicant = a2, Status = Status.Accepted };
    var ap3 = new ApplicantPosition { appliedPosition = p2, applicant = a2, Status = Status.Rejected };

    var db = new[] { ap1, ap2, ap3};

    var query = 
        from ap in db 
        group ap by ap.appliedPosition into g
        select new
        {
            positionName = g.Key.name,
            peopleApplied = g.Count(x => x.Status == Status.Applied),
            peopleAccepted = g.Count(x => x.Status == Status.Accepted),
            peopleRejected = g.Count(x => x.Status == Status.Rejected),
        };

    query.Dump();
}

Результат будет:

positionName     peopleApplied peopleAccepted peopleRejected
.net developer   1             1              0
java developer   0             0              1
1 голос
/ 13 октября 2011

Согласно моему опыту, вы можете использовать LinQ или Entity Framework, просто отобразив свои таблицы в DBML в файл модели Entity Framework.Иначе Microsoft предоставляет вам класс Dynamic LinQ, который вы можете использовать. Я думаю, что вы сопоставляете все свои столбцы и пользовательский класс Dynamic LinQ.

...