2014-04-07 1 views
0

ViewModels (GameSectionVM 및 ReleaseInfoVM)을 두 개 결합한 다음 데이터로 적절하게 채우는 방법을 알아 내려고합니다. 나는 내가 어떻게하는지 안다.). 일반적으로 나는 하나의 코드를 다른 것으로 복사하지만, 끊기고있는 것은 GameSectionVM이 DB 쿼리의 단일 행 결과만을 포함하는 반면 다른 VM (ReleaseInfoVM)은 0 이상의 행을 포함한다는 사실입니다. 결과. 또한 VM에 모든 데이터를 채우는 방법에 대해 조금 확신이 없으며 코드에 대한 올바른 생각이 필요합니다.두 개의 ViewModel을 결합하여 하나의 행을 포함하는 결과 1 개, 여러 행 결과를 포함하는 다른 하나

GameSectinVM :

public class GameSectionVM 
{ 
    public string GameTitle { get; set; } 
    public string LogoFileName { get; set; } 
    public string Synopsis { get; set; } 
} 

ReleaseInfoVM

public class ReleaseInfoVM 
{ 
    public Int16 SectionID { get; set; } 
    public string ReleaseName { get; set; } 
    public string Platform { get; set; } 
    public string Publisher { get; set; } 
    public string Location { get; set; } 
    [HiddenInput] 
    public DateTime? ReleaseDate { get; set; } 
    [HiddenInput] 
    public string ReleaseDateText { get; set; } 
    public string DateReleased 
    { 
     get 
     { 
      return (ReleaseDate.HasValue) ? ReleaseDate.ToString() : ReleaseDateText; 
     } 
    } 
} 

이 내가 현재 VM을 채우기 모두에 사용하는 코드입니다 :

var model = (from s in db.Sections 
      join f in db.Files 
      on s.LogoFileID equals f.ID into s_f 
      where s.RouteName == SectionName 
      from x in s_f.DefaultIfEmpty() 
      select new GameSectionVM 
      { 
       GameTitle = s.Title, 
       LogoFileName = x.FileName, 
       Synopsis = s.Synopsis 
      }).Single(); 
var ReleaseInfo = db.Releases.All(r => r.SectionID == SectionID); 

나는 ReleaseData을 채우기 위해 코드를 것 이미징 것 두 VM을 결합 할 때 동일하게 유지하지만 var ReleaseInfo 대신 uld가 model.ReleaseInfo

편집 : 각 게임 섹션에 여러 개의 릴리스가있을 수 있다는 점을 잊어 버렸습니다. 두 개의 VM을 결합하여 단일 모델에보기로 넘어가려면 섹션의 제목, 로고, 종관을 갖게됩니다. , 그리고 해당 게임의 각 릴리스에 대한 모든 릴리스 정보. FKGameSectionVMReleaseInfoVM 서로처럼 아무것도 보이지 않는 점을 감안

답변

1

이것이 GameSectionVMReleaseInfoVM 사이의 상위 -> 하위 관계 인 경우 ICollection<ReleaseInfoVM>을속성에 추가하는 것이 가장 쉬운 방법입니다.. VM을 채우기 위해

public class GameSectionVM 
{ 
... 
public ICollection<ReleaseInfoVM> ReleaseInfos {get;set;} 
} 

코드 :

// this var will evaluate to GameSectionVM 
var model = (from s in db.Sections 
... 
}).Single(); 

model.ReleaseInfos = (from r in db.Releases 
... 
// Do your query logic to populate the ReleaseInfoVM tables here 
); 
+0

감사합니다. 제안 된대로 ICollection 을 추가했지만 정보를 얻기위한 쿼리에서 IQueryable에서 ICollection으로 변환 할 수 없다고 말합니다. 'model.ReleaseInfo = (from r.db.Releases r.All();' – Matthew

+1

VM에서 IQueryable을 사용하거나 (성능 문제를 읽으려는 경우)'.All()을 사용할 수 있습니다. ToList();' – Claies

0

Section.ID에 데이터베이스 수준에서 두 테이블 (제 및 릴리스가) Release.SectionID가 됨으로써 서로 연결되어, 당신이 무슨 뜻인지 가정은 세 번째를 만드는 것입니다 하나의 속성이 GameSectionVM이고 다른 하나가 ReleaseInfoVM 인 컬렉션 인 ViewModel

은 매우 간단합니다 :

public class CombinedVM 
{ 
    public GameSectionVM GameSection { get;set;} 

    public IEnumerable<ReleaseInfoVM> ReleaseInfos { get;set; } 
} 

... 그리고 이미 GameSectionVMReleaseInfoVM 인스턴스의 목록을 검색 한 가정이 같은 모델을 만들 수 있습니다 :

var newModel = new CombinedVM() { GameSection = model, ReleaseInfos = ReleaseInfo }; 
+0

내가해야 게임 섹션은 0 개 이상의 릴리스 정보 (즉, 여러 릴리스 날짜/위치)가 것이라고 포스트에 명시된 그래서 두 있어야합니다 죄송합니다 동일한 ViewModel의 일부가 될 수 있지만 게임 섹션에는 Title, Logo 및 Synopis가 하나만 포함되어 있지만 여러 세트의 릴리스 정보를 가질 수 있으므로이 두 가지를 결합하는 방법을 잘 모릅니다. 원본 게시물에 수정 사항을 추가하여 둘 사이의 연결을 만들었습니다. – Matthew