Asp.net mvc 组合两个ViewModel,一个包含单行结果,另一个包含多行结果

Asp.net mvc 组合两个ViewModel,一个包含单行结果,另一个包含多行结果,asp.net-mvc,asp.net-mvc-viewmodel,Asp.net Mvc,Asp.net Mvc Viewmodel,我正试图找出如何将我创建的两个ViewModels组合起来(GameSectionVM和ReleaseInfoVM),然后用数据适当地填充它(我想我知道怎么做)。通常我只是将代码从一个复制到另一个,但让我挂断电话的是,GameSectionVM将只包含DB查询的一行结果,而另一个VM(ReleaseInfoVM)将包含0或更多行结果。我也有点不确定如何用所有数据填充VM,只需要确认我的代码思想在这方面是正确的 GameSectinVM: public class GameSectionVM {

我正试图找出如何将我创建的两个
ViewModels
组合起来(GameSectionVM和ReleaseInfoVM),然后用数据适当地填充它(我想我知道怎么做)。通常我只是将代码从一个复制到另一个,但让我挂断电话的是,GameSectionVM将只包含DB查询的一行结果,而另一个VM(ReleaseInfoVM)将包含0或更多行结果。我也有点不确定如何用所有数据填充VM,只需要确认我的代码思想在这方面是正确的

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;
        }
    }
}
这是我当前用于填充这两个虚拟机的代码:

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合并时会保持不变,但它会变成
model.ReleaseInfo


编辑:我忘了注意到每个游戏部分都可以有多个版本,这就是为什么我想合并两个虚拟机,以便传递给视图的单个模型将具有该部分的标题、徽标、概要以及该游戏每个版本的所有发布信息。在数据库级别,两个表(Section和Release)通过
Release连接在一起。SectionID
FK
Section.ID

,因为
GameSectionVM
ReleaseInfoVM
看起来一点都不一样,我假设您的意思是创建第三个ViewModel,该ViewModel将单个
GameSectionVM
作为属性,将一组
ReleaseInfoVM
实例作为另一个属性

这应该相当简单:

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

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

如果这是
GameSectionVM
ReleaseInfoVM
之间的父子关系,那么最简单的方法就是在
GameSectionVM
的属性中添加
ICollection

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

抱歉,我应该在帖子中声明,游戏部分将有0或更多发布信息(即多个发布日期/位置),因此这两个应该是同一ViewModel的一部分,但由于游戏部分只有1个标题、徽标和Synopis,但可以有多组发布信息,我不确定如何组合这两个信息。我在原始帖子中添加了一个编辑,在两者之间建立了联系。谢谢,我按照建议添加了一个
ICollection
,但现在获取信息的查询显示它无法从IQueryable转换为ICollection
model.ReleaseInfo=(从db.Releases中的r开始,其中r.SectionID==model.SectionID选择new ReleaseInfoVM{}).All();
您可以在VM中使用
IQueryable
(您可能需要了解性能问题)或者使用
.All().ToList();
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
);