Запрос отдельных столбцов по строкам с фильтрацией по другому столбцу - PullRequest
0 голосов
/ 29 марта 2020

Я работаю над проектом с использованием Linq и Entity Framework Core.

Я борюсь с запросом.

У меня есть две модели доступа к данным.

public class JobPost
{
  public int Id {get;set;}
  public string RoleTitle  { get; set;}
  public Domain Domain1 {get;set;}
  public Domain Domian2 {get;set;}
  public Domain Domain3 {get;set;}
  public Domain Domain4 {get;set;}
  public Domain Domain5 {get;set;}
}

[Owned]
public  class Domain
{
   public int? CategoryId {get;set;}
   public int? SubcategoryId {get;set;}
}

Должность - это объект / таблица с Id в качестве ключа. У него есть одно название роли (обязательно) и 1-5 доменов (это объясняет, почему свойства Id домена обнуляются). Домен имеет CategoryId и SubcategoryId в качестве ключей. Соискатели смогут фильтровать вакансии по доменам. Примеры доменов:

            Category      Subcategory
Domain      IT            Mobile
Domain      IT            Database
Domain      IT            Design
Domain      Transport     Driving
Domain      Transport     Spedition

Два домена различаются, если они различаются по их ID категории или ИД подкатегории.

Случай пользователя для рассматриваемого запроса: Пользователь (Работодатель X) опубликовал 3 должности: Y, Z и W. И Y, и Z имеют «Разработчик Sotware» в качестве названия роли, в то время как W имеет «Фронтальный разработчик». Вакансия Y имеет один домен: IT, Mobile. Работа должность Z имеет два домена: ИТ, мобильный и ИТ, базы данных. Вакансия W имеет один домен: IT, дизайн. Теперь пользователь хочет создать третий пост. Пользователь нажимает кнопку + Post и получает запрос либо выбрать предыдущее название роли («Разработчик Sotware» или «Front-end разработчик»), либо создать новую. В этом случае пользователь выбирает «Разработчик Sotware» из списка предыдущих пунктов. Далее пользователю предлагается отправить домены. Мы хотим упростить задачу для нашего пользователя, представив на выбор список отдельных доменов, которые ранее применялись для должностей с ролью «Разработчик программного обеспечения». В этом конкретном случае c в списке есть два домена: «IT, мобильный» и «IT, база данных», к которым может обратиться пользователь.

Так что вопрос в том, как написать этот запрос в Linq, поэтому мы получаем IEnumerable из всех отдельных доменов, которые применяются для указанного c роли роли во всех должностях, выполняемых сервером SQL, а НЕ клиентом.

Я пробовал разные стратегии такие как projectiong, объединение, группировка в Linq, но без результатов, которые я хочу. Единственный способ, которым я могу это сделать, - это получить все должности, отфильтрованные по названию роли, и удалить дубликаты в моей модели представления.

from p in dbCotext.JobPosts
where p.RoleTitle == roleTitle
select p

//client code for removing duplicates, not what I want

Возможно ли сделать это в Linq или мне нужно написать этот запрос в SQL?

Заранее спасибо.

1 Ответ

1 голос
/ 31 марта 2020
 PreviousSubcategories =
          from c in dbContext.Categories
             let posts = 
             from p in a.Posts p in dbContext.Posts
             where p.RoleTitle == roleTitle
             where (c.Id == p.Domain1.CategoryId
             || c.Id == p.Domain2.CategoryId
             || c.Id == p.Domain3.CategoryId
             || c.Id == p.Domain4.CategoryId
             || c.Id == p.Domain5.CategoryId
             orderby p.CreatedOn descending 
             select new Domain[]
                   {
                     p.Domain1,
                     p.Domain2,
                     p.Domain3,
                     p.Domain4,
                     p.Domain5
                   }
            where posts.Any()
            select new DomainViewModelDto
                  {
                      SubcategoryId = (int)c.Id,
                      SubcategoryName = c.Name,
                      LatestExperienceLevelsApplied = new LatestExperienceLevelsApplied
                      {
                          IsExperienceLevel1Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel1Applied,
                          IsExperienceLevel2Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel2Applied,
                          IsExperienceLevel3Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel3Applied,
                          IsExperienceLevel4Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel4Applied,
                          IsExperienceLevel5Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel5Applied,
                          IsExperienceLevel6Applied = (bool)posts.First().Where(d => d.CategoryId == c.Id).First().IsExperienceLevel6Applied,
                      }


                  }
...