mvc 5를 사용하여 mvc 응용 프로그램에 메시지 시스템을 개발하려고합니다. Event, EventUser, EventObject라는 테이블이 있습니다. 각 테이블에는 다음이 있습니다.
행사
신분증
생성자
시작 시간
IsShared
예산
EventUser
EventID
UserID
IsAccepted
EventObject
EventID
ObjectID
내 messageController에는 사용자 ID의 매개 변수를받는 인덱스 메서드가 있습니다. 사용자가이 메서드를 사용하여 초대 한 모든 이벤트를 표시해야합니다.
namespace MvcApp.Controllers
{
public class MessageController : Controller
{
private EPlannerDatabaseEntities db = new EPlannerDatabaseEntities();
// GET: /Message/
public ActionResult Index(int UId)
{
/* linq expressions */
return View();
}
}
}
매개 변수가 전달되면 나는 원한다.
* UID = UserID 인 EventUser 테이블에서 선택하고 EventID 속성을 사용하여 결과를 Event 및 EventObject 테이블과 결합합니다.
* 마지막으로 최종 결과를 사용하여 사용자가 초대 한 모든 이벤트의 정보를 표시해야합니다. CreatedBy, StartTime, Budget, 다른 사용자, 객체 등.
나는 mvc 및 viewmodel 개념을 처음 사용합니다. viewmodel 개념이 이러한 상황에 도움이 될 수 있다고 들었습니다. viewmodel 개념을 사용하여이 문제를 극복 할 수 있습니까? 그렇다면보기 모델에 추가해야하는 것은 무엇입니까 ?? 그렇지 않으면 이것을 수행하는 다른 방법은 무엇입니까?
Entity Framework와 같은 ORM을 사용한 쿼리에 관한 질문 인 경우 테이블 스키마가 아닌 엔터티 를 게시해야 합니다. ORM의 전체 목적은 기본 데이터베이스 구조를 추상화하는 것이므로 스키마는 종종 엔티티 클래스와 유사하지만 상당히 다를 수 있습니다. 결과적으로 엔티티 클래스에 대한 가정을해야합니다.
모든 것을 쿼리하려면 다음과 같은 것이 필요합니다.
var events = db.Events.Where(m =>
m.EventUsers.Any(u => u.UserID == UId && u.IsAccepted)
).Include(m => m.EventObjects);
다음과 같은 항목 클래스를 가정합니다.
public class Event
{
...
public virtual ICollection<EventObject> EventObjects { get; set; }
public virtual ICollection<EventUser> EventUsers { get; set; }
}
public class EventUser
{
...
public int UserID { get; set; }
public bool IsAccepted { get; set; }
}
당신은의 열거 형으로 끝납니다 Event
. EventObject
개별 이벤트에 대한 에 액세스해야하는 경우 적절한 컬렉션 속성을 사용해야합니다. 예를 들면 :
foreach (var item in events)
{
foreach (var obj in item.EventObjects)
{
// do something with `obj` (an invidual `EventObject` instance)
}
}
실제 User
객체 가 필요한 경우 먼저 객체를 쿼리하고 관련 Event
s 및 EventObject
s를 포함하는 것이 좋습니다 .
var user = db.Users.Include("EventUsers.Event.EventObjects").SingleOrDefault(m => m.UserID == UId);
다음과 같은 엔티티를 가정합니다.
public class User
{
...
public virtual ICollection<EventUser> EventUsers { get; set; }
}
public class EventUser
{
...
public virtual Event Event { get; set; }
}
public class Event
{
...
public virtual ICollection<EventObject> EventObjects { get; set; }
}
그러나이 방법을 사용하면 포함 Event
된를 수락 여부에 따라 필터링 할 수 없습니다. 이에 대한 잠재적 인 방법이 있지만 EventUsers
전체 지연 로딩을 비활성화해야하며 필요한 정보를 쿼리하는 작업이 복잡해집니다. 해당 경로로 이동해야하는 경우 https://msdn.microsoft.com/en-us/data/jj574232.aspx#explicitFilter를 참조 하십시오 .
그렇지 않으면 컬렉션을 반복하기 전에 허용되지 않는 이벤트를 제외 할 수 있습니다.
var events = user.EventUsers.Where(m => m.IsAccepted).Select(m => m.Event);
실제로 이것에 대해 뷰 모델 자체가 필요하지 않습니다. 이벤트 목록 (관련 항목 포함 EventObject
) 또는 단일 사용자 인스턴스 (관련 이벤트 및 관련 항목 포함 EventObject
)를 뷰에 직접 전달할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다