2017-01-25 1 views
0

Я никогда не использовал JOIN(INNER, OUTER), и я не имею ни малейшего представления, когда это лучший сценарий:Я никогда не использовал JOIN. Когда правильное время?

Вот у меня есть два примера ActionResults, который использует 2 или 3 запросы, чтобы получить объект, не лучше использовать a JOIN вместо этого?

Первый пример:

public ActionResult JobTags(int id) 
{ 
    var jobTagsList = (from j in db.JobTags 
          where j.JobID == id 
          select j.TagID).ToList(); 

    var tags = (from j in db.Tags 
        where jobTagsList.Contains(j.ID.ToString()) 
        select j).ToList(); 

    return View(tags); 
} 

Могу ли я просто JOIN эти две таблицы и выберите, что J в конце?

Второй пример:

public ActionResult ImageListWhoApp(int id) 
{ 
    //We get here the ID from Job page using dbo.Jobs 
    var userIdList = (from j in db.Jobs 
          where j.ID == id 
          select j.ID.ToString()).ToList(); 

    //We get here who applied at this job using dbo.AppliedJobs 
    var appJobIdList = (from j in db.AppliedJobs 
        where userIdList.Contains(j.JobID.ToString()) 
        select j.UserID).ToList(); 

    //Finally we get here the avatars of the user who applied at the job 
    //We are using this as a hyperlink to user profile. 
    var appUserImage = (from j in db.Images 
          where appJobIdList.Contains(j.UserID.ToString()) 
          select j).ToList(); 

    return View(appUserImage); 
} 

Не такой подход становится смешно? Или нормально делать такие вещи таким образом? Как я могу сделать JOIN из этих заявлений 3 SQL? Является ли это возможным? это лучший способ?

Благодарим вас за внимание!

+1

У вас нет навигационных свойств в классах моделей? Это то, что делает Joins главным образом ненужным. –

+1

меня тоже, потому что 'JOIN' в LINQ является подробным и ограниченным по сравнению с' JOIN' в T-SQL. – qxg

+1

Если вы используете EF и имеете свойства навигации, тогда 'JOIN' обычно не требуется. Но если у вас есть два списка с объектами, которые вы хотите объединить, то это имеет большой смысл. – Oliver

ответ

1

Вам не нужны соединения. Вы можете использовать навигационные свойства:

var tagsQry = 
    from tag in db.Tags 
    where tag.JobTag.JobID == id 
    select tag; 

var userImageQry = 
    from img in db.Images 
    from appJob in db.AppliedJobs 
    where (img.UserID == appJob.UserID) && (appJob.Job.ID == id) 
    select img; 

Даже если у вас нет навигационных свойств, вам не нужно присоединяется:

var tagsQry = 
    from tag in db.Tags 
    from jobTag in sb.JobTags 
    where (jobTag.JobID == id) && (tag.ID == jobTag.TagID) 
    select tag; 

var userImageQry = 
    from img in db.Images 
    from appJob in db.AppliedJobs 
    from job in db.Jobs 
    where (img.UserID == appJob.UserID) && (appJob.JobID == job.ID) && (job.ID == id) 
    select img; 

Однако вы можете использовать присоединяется, если вы предпочитаете синтаксис. Сторона запроса план выполнения DB будет точно так же:

var tagsQry = 
    from tag in db.Tags 
    join jobTag in sb.JobTags on tag.ID equals jobTag.TagID 
    where (jobTag.JobID == id) 
    select tag; 

var userImageQry = 
    from appJob in db.AppliedJobs 
    join img in db.Images on appJob.UserID equals img.UserID 
    join job in db.Jobs on appJob.JobID equals job.ID 
    where (job.ID == id) 
    select img; 

Во втором примере вам нужно только запрос (или присоединиться) к Jobs, если у вас нет внешнего ключа на AppliedJobs.JobID. Если вы это сделаете, вы можете сравнить AppliedJobs.JobID напрямую с id.

+0

На самом деле я полностью забыл о свойствах навигации, но в любом случае моя дилемма была о 'JOIN' и почему я должен использовать это или нет, потому что я не вижу смысла в этом после долгого обучения MVC. – Eduard

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