2014-01-21 3 views
1

MVC에서 탐색 속성이 작동하는 방식에 대해 약간 혼란 스럽습니다. Entity Framework 탐색 속성보기에 대한 설명

이의이 코드를 살펴 보자 :
var messages = db.messages // .Include("user_reciever").Include("user_sender") 
    .Where(M => M.receiver_id == _User.id && M.delete_code != 1) 
    .OrderByDescending(M => M.timestamp); 

return View(messages.ToList()); 

내가 포함 그래서 필드 "user_reciever"와 "user_sender"를 제외 포함되어 있지 않습니다.

@foreach (var item in Model) 
{ 
    var tr_style = item.message_read == false ? "font-weight:bold" : ""; 
    <tr style="@tr_style"> 
     <td> 
      <input type="checkbox" name="MessageIds" id="MessageIds" value="@item.id"/> 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.message_read) 
     </td> 
     <td> 
      @Html.ActionLink(item.user_sender.username, "Overview", "User", new { username = item.user_sender.username }, null) 
     </td> 
     <td> 
      @Html.ActionLink(item.subject, "Details", new { id = item.id }) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.timestamp) 
     </td> 
    </tr> 
} 
</table> 

공지 사항이 코드를 사용하고 방법 : 사용자 이름 = item.user_sender.username은, 그러나, 나는 DB에서 "user_sender"를 포함하지 않았다

하지만, 내보기에,이이 요구.

이 코드가 없어도이 코드는 여전히 작동합니다. 그게 정확, A는 문을 결합 사용하여 DB를 호출하여

  1. 탐색 속성 일 :

    그래서 내 질문은?

  2. item.user_sender.username과 같은 탐색 속성을 사용할 때 별도의 DB 호출이 필요합니까? 즉 foreach가 각 항목에 대해 DB를 호출하는 것입니다. 맞습니까?

  3. 위의 코드에서 모든 foreach 항목에 대해 DB를 호출합니까? .Include ("user_reciever"). Include ("user_sender")를 추가하면 모든 foreach 항목에 대해 Db를 호출하지 않을 것입니까? (모든 항목이 이미 하나의 db join 문으로 미리로드되어 있기 때문에 아니오라고 추측합니다)

  4. 이 코드를 실행하는 효과적인 방법입니까? 나는 다른 테이블에서 사용자 이름이 들어있는 사용자 메시지를 표시하지 않습니다. 사용자 Sender_id, Reciever_id를 사용하여 보낸 사람과 수신자를 확인합니다.

감사합니다.

답변

0

네비게이션 속성은 조인 문을 사용하여 DB를 호출하여 작동합니다 ( ).

네비게이션 속성을로드하는 방법에 따라 다릅니다. Include 메서드를 사용하여로드하면 join 초가 사용됩니다. 이 property는 게으른 경우 는, 당신은 item.user_sender.username 같은 탐색 속성을 사용하는 경우 그것은 join

을 필요로하지 않습니다로드 그 DB에 별도의 전화? 그건 foreach가 각 항목에 대해 DB를 호출하는 것입니다.

예. include 메서드를 사용하지 않는 경우

위의 코드에서 모든 foreach 항목에 대해 DB를 호출합니까? 내가 에 .Include ("user_reciever")를 추가하면 Include ("user_sender")는 으로 모든 foreach 항목에 대해 Db를 호출하지 않을 것입니까?

예 (모든 항목이 이미 일dB에 미리로드하기 때문에 나는 문을 가입없이 추측 오전).

이 코드를 실행하는 효과적인 방법입니까? 다른 테이블의 Username을 포함하는 사용자 메시지를 표시하지 않습니다. 나는 사용자 Sender_id, Reciever_id를 사용하여 보낸 사람과 수신자를 확인합니다.

여기에서는 Include 방법을 사용하는 것이 더 효과적입니다. 필수 필드 만로드하도록 조회 결과를 투영 할 수 있습니다. 이 방법은 Include 방법을 사용할 때보 다 빠릅니다.

var messages = db.messages 
         .Where(M => M.receiver_id == _User.id && M.delete_code != 1) 
         .OrderByDescending(M => M.timestamp) 
         .Select(m => new MessageModel { Id = m.id, Sender = m.user_sender.username, /* etc */ }).