C# EF核心加载到ViewModel

C# EF核心加载到ViewModel,c#,linq,asp.net-core,entity-framework-core,foreign-key-relationship,C#,Linq,Asp.net Core,Entity Framework Core,Foreign Key Relationship,在我的ASP.NET Core 1.1和EF Core 1.1 app中,我有一个类似于以下的场景:父表PT和子表CH具有1-1 FK关系。我们需要从PT表的某些记录中获取一些列,从CH表的相关记录中获取一些列问题:如何使用以下LINQ查询将这些记录加载到以下ViewModel注意:我可以使用常规的LINQ连接等来完成它,但我很好奇如何使用快速加载来完成它 视图模型: public class PT_CH_ViewModel { Public int PTCol1 {get; set;} Pub

在我的
ASP.NET Core 1.1
EF Core 1.1 app
中,我有一个类似于以下的场景:父表
PT
和子表
CH
具有1-1 FK关系。我们需要从
PT
表的某些记录中获取一些列,从
CH
表的相关记录中获取一些列问题:如何使用以下LINQ查询将这些记录加载到以下
ViewModel
注意:我可以使用常规的LINQ连接等来完成它,但我很好奇如何使用
快速加载来完成它

视图模型:

public class PT_CH_ViewModel
{
Public int PTCol1 {get; set;}
Public string PTCol1 {get; set;}
Public float PTCol1 {get; set;}
....
Public int CHCol1 {get; set;}
Public string CHCol2 {get; set;}
....
}
控制器:需要在此处加载
PT\u CH\u ViewModel
,并将其作为列表返回

....
PT pt = _context.PT
                .Include(p => p.CH)
                .Where(p => p.PTcol == selectedID);
....
return View(???);

您需要具有CH实体的导航属性。加载后,您可以访问导航属性的内容

public class PT
{
    public int Col1 { get; set; }
    ...
    public virtual CH CH { get; set; } // optional, do not put [Required] attribute
}

public CH
{
    public int Col1 { get; set; }
    ...
    [Required] // CH table needs PT table for the 1-1 relationship
    public PT PT { get; set; }
}


PT_CH_ViewModel viewModel = new PT_CH_ViewModel()
{
    PTCol1 = pt.Col1,
    PTCol2 = pt.Col2,
    PTCol3 = pt.Col3,
    CHCol1 = pt.CH.Col1,
    CHCol2 = pt.CH.Col2
};


return View(viewModel);
由于您需要将其作为列表,因此可以执行以下操作:

var pts = _context.PT
                .Include(p => p.CH)
                .Where(p => p.PTcol == selectedID)
                .Select(pt => new PT_CH_ViewModel()
                {
                    PTCol1 = pt.Col1,
                    PTCol2 = pt.Col2,
                    PTCol3 = pt.Col3,
                    CHCol1 = pt.CH.Col1,
                    CHCol2 = pt.CH.Col2
                }).ToList();

return View(pts);
视图:

@型号列表

您需要拥有CH实体的导航属性。加载后,您可以访问导航属性的内容

public class PT
{
    public int Col1 { get; set; }
    ...
    public virtual CH CH { get; set; } // optional, do not put [Required] attribute
}

public CH
{
    public int Col1 { get; set; }
    ...
    [Required] // CH table needs PT table for the 1-1 relationship
    public PT PT { get; set; }
}


PT_CH_ViewModel viewModel = new PT_CH_ViewModel()
{
    PTCol1 = pt.Col1,
    PTCol2 = pt.Col2,
    PTCol3 = pt.Col3,
    CHCol1 = pt.CH.Col1,
    CHCol2 = pt.CH.Col2
};


return View(viewModel);
由于您需要将其作为列表,因此可以执行以下操作:

var pts = _context.PT
                .Include(p => p.CH)
                .Where(p => p.PTcol == selectedID)
                .Select(pt => new PT_CH_ViewModel()
                {
                    PTCol1 = pt.Col1,
                    PTCol2 = pt.Col2,
                    PTCol3 = pt.Col3,
                    CHCol1 = pt.CH.Col1,
                    CHCol2 = pt.CH.Col2
                }).ToList();

return View(pts);
视图:

@型号列表

Hi,你可以使用automapper。Hi,你可以使用automapper。在你的代码的最后一块:1)你的意思是
p.col1。如果需要,可以使用
ToList()
。我打算使用
pt=>
而不是'p=>'。已编辑。在代码的最后一块中:1)您的意思是
p.col1…等
而不是
pt.col1…等
2)我是否仍然需要将ToList()应用于
pts
pts
本身将是一个列表?@nam它将返回一个
IEnumerable
。如果需要,可以使用
ToList()
。我打算使用
pt=>
而不是'p=>'。编辑。