私はスキルを保存するスキルテーブルを持っています。そして、 '仕事'テーブルでは、UpWorkのようなポストジョブのときに必要なスキルをすべて保存します。従業員はすべての必要なスキルを選択するためのチェックボックスを持っています。しかし、私はskillIDを次のように格納します:1,5,6,8のジョブテーブル。私は、ジョブの詳細を取得するとき、私はジョブのジョブテーブルの他の詳細とSkillNameを表示したいので、私はすべてのスキルの名前を取得したい。私のWeb APIを:Web Apiの別のテーブルからコンマで区切られたIDの値を取得します。ライブでは機能しません。
[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);
}
私の問題のコードは私のVS 2013年にうまく機能しているが、私はGoDaddyのライブサーバーにアップロードするとき、それは動作しないということです! 500内部サーバエラー を返すようになりました。私はLinqの代わりにSQLクエリを作成します。私は希望の結果でSQLを実行できますか?
===================編集=====================
あなたSQLコードはうまく機能します。しかし、私は他の人が履くことを条件にしています。 1.まだクローズされていないジョブを表示する必要があります(ClosedJobsテーブルはクローズドジョブIDを取得します).ClosedJobsテーブルにジョブIDがある場合、リストには戻りません。
join cj in db.ClosedJobs.DefaultIfEmpty()
on j.JobID equals cj.JobID into closedJob
where !closedJob.Any()
(契約テーブルは、契約として開始されたジョブのジョブIDを取る)
-
第二編集= ==================
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)
EXP:Job
表にはAppliedJobs
テーブルとの関係を持っています。 AppliedJobs
テーブルにJobOffersとの関係があります。 JobOffers
はContracts
と関係しています。 完了したジョブを表示したくありません。(Contracts.CompletedDate != null
)契約が開始されると、フィールドCompletedDate
はnullに設定されます。契約が完了すると、完了日までヌルに変更されます。
ここで条件を適用しますか?
どうすればいいですか?手伝って頂けますか? @ジョンCappelletti
」 選択j.Deadline、j.Budget、j.Category 、スキル=ジョブJ 外からB.String 適用( 選択文字列=スタッフ((選択 '、' +スキル名 スキルからl ここで、XMLパス( ''))の場合、 の の場合、charindex(concat( '、' SkillID、 '、') '、' + j.ReqSkill + '、')> 0 )B "それは動作します。しかし、私はどこで他の条件を入れますか?投稿の編集部分を参照してください。 @ジョンCappelletti – Fawel
それは動作します! 2番目のスキルを説明してください。 – Fawel
2nd編集@John Cappelletti – Fawel