2016-01-06 2 views
2

Я хочу создать ссылочную целостность для представлений. Я знаю, что это невозможно в базе данных, но с использованием EF я ищу способ достичь этого.Entity Framework & Views

Ситуация похожа на следующее:

вид (vSkillMatch) имеет три колонки: JobId, matchingskillid, candidateid.

Данные составлены от JobDescription, SkillInfo & Candidate столов соответственно.

от моего веб-апи Я хочу вернуть следующие поля:

jobtitle, joblocation, candidatename, MobileNumber, matchingskillName

эти поля доступны в соответствующих таблицах.

В настоящее время я делаю так:

метод веб-апи

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

Code-первых/дб-первых? –

+0

db-first aplied –

+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' и т. Д.). я получаю ошибку 'Method Find (System.Object []), объявленный в типе 'System.Data.Entity.DbSet, не может быть вызван с экземпляром типа' System.Data.Entity.Core.Objects.ObjectQuery', когда я пытаюсь выполнить код –

+0

Мне очень жаль, моя ошибка. Действительно, Find не может быть переведен в запрос. Я изменил код, чтобы вместо этого использовать метод First. Пожалуйста, попробуйте сейчас. – mr100

+0

Извините, последнее изменение - FirstOrDefault следует использовать вместо первого – mr100

Смежные вопросы