【发布时间】: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