【问题标题】:Get value for each of array from another table in Web Api LINQ-Asp从 Web Api LINQ-Asp 中的另一个表中获取每个数组的值
【发布时间】:2024-05-21 23:00:01
【问题描述】:

我有一个存储技能的“技能”表。在“工作”表中,我在发布工作时存储了所有必需的技能。员工有复选框来选择所有必需的技能。但我将 SkillID 存储为:1,5,6,8 在工作表中。当我检索工作详细信息时,我想获取所有技能的名称,因为我想从工作表中显示 SkillName 以及工作的其他详细信息。 我的网络接口:

 public object GetJobDetails()
    {

        var data = (from j in db.Jobs
                                 where j.Preference == 2
                                 select new
                                 {
                                   j.JobTitle,
                                   j.JobID,
                                   j.Budget,
                                   j.Deadline,
                                   j.Employeer,
                                   j.JobDetails,
                                   j.PublishDate,
                                   j.ReqSkill,
                                   Category = (from gg in db.Categories where gg.CategoryID == j.Category select gg.CategoryName).FirstOrDefault()

                                 }).ToList();


        return data.AsEnumerable();
    }

每个作业的“j.ReSkill”响应为 1,5,6,8。 如何在所有其他字段中获取 SkillName 而不是 ID——例如 'PHP'、'WordPress'、'ASP'。 或者,我应该在发布职位时存储 SkillName 而不是 ID?

如何进行 LINQ 查询来获取此信息? 提前致谢。

于 17 年 4 月 8 日编辑

在实时服务器中,此代码不起作用,但在 localhost 中!!!!

[HttpGet]
    [Route("api/JobApi/BrowseJobs/")]
    public object BrowseJobs()
    {

        var skills = db.Skills.ToDictionary(d => d.SkillID, n => n.SkillName);

        var jobData = (from j in db.Jobs where j.Preference==2
                       //from cj in j.ClosedJobs.DefaultIfEmpty() 
                       join cj in db.ClosedJobs.DefaultIfEmpty()
                       on j.JobID equals cj.JobID into closedJob
                       where !closedJob.Any()
                       join c in db.Categories on j.Category equals c.CategoryID

                       join jobContract in
                           (
                               from appliedJob in db.AppliedJobs.DefaultIfEmpty()
                               from offer in appliedJob.JobOffers.DefaultIfEmpty() 
                               from contract in db.Contracts.DefaultIfEmpty()
                               select new { appliedJob, offer, contract }
                               ).DefaultIfEmpty()
                       on j.JobID equals jobContract.appliedJob.JobID into jobContracts
                       where !jobContracts.Any(jobContract => jobContract.contract.CompletedDate != null)

                       select new
                       {

                           JobTitle = j.JobTitle,
                           JobID = j.JobID,
                           ReqSkillCommaSeperated = j.ReqSkill,
                           Category = c.CategoryName,
                           Budget=j.Budget,
                           Deadline=j.Deadline, 
                           JobDetails=j.JobDetails,
                           PublishDate=j.PublishDate,
                           TotalApplied=(from ap in db.AppliedJobs where j.JobID == ap.JobID select ap.AppliedJobID).DefaultIfEmpty().Count()

                       }).AsEnumerable()
            .Select(x => new
            {
                JobID = x.JobID,
                JobTitle = x.JobTitle,
                Category = x.Category,
                Budget = x.Budget,
                Deadline = x.Deadline,
                JobDetails = x.JobDetails,
                PublishDate = x.PublishDate,
                SkillNames = GetSkillName(x.ReqSkillCommaSeperated, skills),
                TotalApplied = (from ap in db.AppliedJobs where x.JobID == ap.JobID select ap.AppliedJobID).DefaultIfEmpty().Count()
            }).ToList();


        return jobData.AsEnumerable();
    }



    private string GetSkillName(string reqSkill, Dictionary<int, string> skills)
    {
        if (reqSkill == null) return string.Empty;
        var skillArr = reqSkill.Split(',');
        var skillNameList = skillArr.Select(skillId => skills[Convert.ToInt32(skillId)])
                                    .ToList();
        return String.Join(",", skillNameList);
    }

【问题讨论】:

  • 你真的应该把它改成一个不错的多对多关联,即使用JobSkill 联结表。现在您没有任何参照完整性,并且使用此代码非常不方便 - 正如您已经发现的那样。

标签: c# asp.net linq asp.net-mvc-4 asp.net-web-api


【解决方案1】:

使用您当前的架构结构,我建议您将所有技能 ID 和名称读取到字典中,并遍历作业集合中的每个作业并获取 ReqSkill,使用 string.Split 方法获取单个 SkillId 并获取相应的我们的技能词典中的名称。

像这样的

var skills = db.Skills.ToDictionary(d => d.Id, n => n.Name);
var jobData = (from j in db.Jobs
                join c in db.Categories on j.CategoryId equals c.CategoryID 
                select new
                {
                    JobTitle = j.JobTitle,
                    JobID = j.JobID,
                    ReqSkillCommaSeperated = j.ReqSkills,
                    Category = c.Name
                    // Add other properties as needed
                }).AsEnumerable()
    .Select(x => new
    {
        JobID = x.JobID,
        JobTitle = x.JobTitle,
        Category = x.Category,
        SkillNames = GetSkillName(x.ReqSkillCommaSeperated , skills)
    }).ToList();

假设您有一个名为 GetSkillName 的方法,它接受逗号分隔的 SkillId 和技能字典并返回一串以逗号分隔的技能名称

private string GetSkillName(string reqSkill, Dictionary<int, string> skills)
{
    if (reqSkill == null) return string.Empty;
    var skillArr = reqSkill.Split(',');
    var skillNameList = skillArr.Select(skillId => skills[Convert.ToInt32(skillId)])
                                .ToList();
    return String.Join(",", skillNameList);
}

另一个选项是创建一个名为 JobSkills 的新表,您将在其中存储 JobIdSkillId。使用这种方法,您可以简单地编写三个表之间的连接并根据需要获取数据。

【讨论】:

  • 如果我制作一个 JobSkills 表,如何存储特定工作的技能?我应该在提交中存储技能吗?我该怎么做?
最近更新 更多