2016-01-06 96 views
2

我想創建視圖的參照完整性。我知道它不可能在數據庫中,但使用EF我正在尋找一種方法來實現這一點。實體框架和視圖

現狀是這樣的:

視圖(vSkillMatch)具有三列:作業ID,matchingskillid,candidateid。

這些分別來自JobDescription,SkillInfo & Candidate表。

從我的網頁API我想返回以下字段:

JOBTITLE,joblocation,candidatename,移動電話號碼,matchingskillName

這些領域均是其各自的表中找到。

目前我做這樣的:

網頁API方法

public List<CandidateBySkillDTO> getCandidate() 
    { 
     var SkillMatches = db.vSkillMatches; 

     List<CandidateBySkillDTO> cbsDTO = new List<CandidateBySkillDTO>(); 

     foreach (vSkillMatch Match in SkillMatches) 
     { 
      CandidateSkillDTO CandidateSkillInfo = new CandidateSkillDTO(Match.CandidateId, Match.SkillId); 

      CandidateBySkillDTO candidateList = new CandidateBySkillDTO(); 

      candidateList.candidateId = CandidateSkillInfo.candidateInfo.Id; 
      candidateList.candidateMobile = CandidateSkillInfo.candidateInfo.PrimaryMobile; 
      candidateList.SkillName = CandidateSkillInfo.skillInfo.SkillName; 

      cbsDTO.Add(candidateList); 
     } 

     return cbsDTO; 

    } 

CandidateBySkillDTO模型類

public class CandidateBySkillDTO 
    { 
     public int candidateId { get; set; } 
     public string candidateName { get; set; } 
     public long candidateMobile { get; set; } 
     public string createdBy { get; set; } 
     public string SkillName { get; set; } 
     public int skillId { get; set; } 
     public string jobTitle { get; set; } 
     public string jobCreated { get; set; } 

    } 

CandidateSkillDTO模型類

public class CandidateSkillDTO 
{ 
    ubietydbEntities db = new ubietydbEntities(); 

    public int candidateId; 
    public int skillId; 

    public CandidateSkillDTO(int CandidateId, int SkillId) 
    { 
     this.candidateId = CandidateId; 
     this.skillId = SkillId; 
    } 

    public Candidate candidateInfo 
    { 
     get 
     { 
      return db.Candidates.Find(this.candidateId); 
     } 

     set 
     { 

     } 
    } 

    public Skill skillInfo 
    { 
     get 
     { 
      return db.Skills.Find(this.skillId); 
     } 
     set 
     { 

     } 
    } 
} 

我覺得我的要求對我的項目來說並不是很大。這是完成這項任務的唯一方法,還是我錯過了EF的一個主要功能來做到這一點?

謝謝。

+0

代碼優先/ DB-第一? –

+0

db-first已加入 –

+0

您可以在edmx設計器 –

回答

1

整個事情可以在一個單一的查詢來完成,以分貝(因此可能更快):

public List<CandidateBySkillDTO> getCandidate() 
{ 
    return db 
     .vSkillMatches 
     .Select(e => new 
     { 
      candidateInfo = db.Candidates.FirstOrDefault(c => c.Id == e.candidateId), 
      skillInfo = db.Skills.FirstOrDefault(s => s.Id == e.skillId) 
     }) 
     .Select(e => new CandidateBySkillDTO 
     { 
      candidateId = e.candidateInfo.Id, 
      candidateMobile = e.candidateInfo.PrimaryMobile, 
      SkillName = e.skillInfo.SkillName 
     }) 
     .ToList(); 
} 
+0

中創建關聯/導航屬性('vSkillMatch.Job'等)謝謝。我得到錯誤類型'System.Data.Entity.DbSet聲明的Method Find(System.Object [])當我嘗試執行時不能用'System.Data.Entity.Core.Objects.ObjectQuery'類型的實例調用代碼 –

+0

我非常抱歉,我的錯誤。確實Find不能翻譯成查詢。我已將代碼更改爲使用First方法。請現在試試。 – mr100

+0

對不起,最後一個變化 - FirstOrDefault應該用來代替第一個 – mr100