0

我正在使用 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 个域(这解释了为什么 Domain 的 Id 属性可以为空)。Domain 有 CategoryId 和 SubcategoryId 作为键。求职者将能够按域过滤职位发布。域的示例是:

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

如果两个域的 categoryId 或 subcategoryId 不同,则它们是不同的。

相关查询的用户案例: 用户(雇主 X)发布了 3 个职位:Y、Z 和 W。Y 和 Z 的职位名称均为“软件开发人员”,而 W 的职位名称为“前端开发人员”。职位 Y 有一个域:IT、移动。职位发布 Z 有两个域:IT、移动和 IT、数据库。职位 W 有一个领域:IT、设计。用户现在想要创建第三个帖子。用户单击 +Post 按钮,系统会提示您选择以前的角色标题(“软件开发人员”或“前端开发人员”)或创建一个新职位。在这种情况下,用户从上一个项目列表中选择“软件开发者”。接下来,提示用户提交域。我们希望通过提供一个可选择的不同域列表来简化我们的用户,这些域之前已申请职位名称为“软件开发人员”的职位。

所以问题是我们如何在 Linq 中编写此查询,以便我们获得所有不同域的 IEnumerable,这些域应用于所有职位的特定角色头衔,由 SQL 服务器执行,而不是由客户端执行。

我尝试了不同的策略,例如在 Linq 中进行投影、加入、分组,但没有得到我想要的结果。我能做到这一点的唯一方法是检索按角色标题过滤的所有职位发布并删除我的视图模型中的重复项。

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

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

甚至可以在 Linq 中执行此操作,还是我必须在 SQL 中编写此查询?

提前致谢。

4

1 回答 1

1
 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,
                      }


                  }
于 2020-03-30T21:12:10.913 回答