2017-04-30 6 views
1

私はスキルを保存するスキルテーブルを持っています。そして、 '仕事'テーブルでは、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); 
} 

enter image description here enter image description here 私の問題のコードは私の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との関係があります。 JobOffersContractsと関係しています。 完了したジョブを表示したくありません。(Contracts.CompletedDate != null)契約が開始されると、フィールドCompletedDateはnullに設定されます。契約が完了すると、完了日までヌルに変更されます。

      ここで条件を適用しますか?

      どうすればいいですか?手伝って頂けますか? @ジョンCappelletti

  • 答えて

    1

    EDIT - 削除OUTERは以下

    をAPPLYはStuff()XMLを使用して簡単な例です。シーケンスが重要な場合は、最初に文字列を分割する必要があります。

    明らかになると、@Skills@YourDataはテーブル変数であり、簡単な例です。

    Declare @Skills table (SkillID int,SkillName varchar(50)) 
    Insert Into @Skills values 
    (1,'ASP') 
    ,(2,'JavaScript') 
    ,(3,'AngularJS') 
    ,(4,'WordPress') 
    ,(5,'Joomla') 
    
    Declare @YourData table (ID int,ReqSkill varchar(50)) 
    Insert Into @YourData values 
    (1,'2,3,4,5,1') 
    ,(2,'3') 
    ,(3,'3,4,5,2') 
    ,(4,null) 
    
    Select A.ID 
         ,Skills = Stuff((Select ',' +SkillName 
             From @Skills 
             Where charindex(concat(',',SkillID,','),','+A.ReqSkill+',')>0 
             For XML Path ('')),1,1,'') 
    From @YourData A 
    -- Your WHERE Statement Here -- 
    

    戻り

    ID Skills 
    1 ASP,JavaScript,AngularJS,WordPress,Joomla 
    2 AngularJS 
    3 JavaScript,AngularJS,WordPress,Joomla 
    4 NULL 
    
    +0

    」 選択j.Deadline、j.Budget、j.Category 、スキル=ジョブJ 外からB.String 適用( 選択文字列=スタッフ((選択 '、' +スキル名 スキルからl ここで、XMLパス( ''))の場合、 の の場合、charindex(concat( '、' SkillID、 '、') '、' + j.ReqSkill + '、')> 0 )B "それは動作します。しかし、私はどこで他の条件を入れますか?投稿の編集部分を参照してください。 @ジョンCappelletti – Fawel

    +0

    それは動作します! 2番目のスキルを説明してください。 – Fawel

    +0

    2nd編集@John Cappelletti – Fawel

    関連する問題