EF-Core 预先加载到 ViewModel
EF-Core Eager Loading to a ViewModel
在我的 ASP.NET Core 1.1
和 EF Core 1.1 app
中,我有一个类似于以下的场景:Parent table PT
和 child table CH
有 1-1 FK-relationship。我们需要从 PT
table 的某些记录中获取几列,并从 CH
table 的关联记录中获取几列。 问题:如何使用以下 LINQ 查询将这些记录加载到以下 ViewModel
? 注意:我可以使用常规的 LINQ Join 等来完成它,但很好奇我们如何使用 Eager Loading
来完成它
ViewModel:
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_CH_ViewModel
并 return 作为列表
....
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);
查看:
@model List<PT_CH_ViewModel>
在我的 ASP.NET Core 1.1
和 EF Core 1.1 app
中,我有一个类似于以下的场景:Parent table PT
和 child table CH
有 1-1 FK-relationship。我们需要从 PT
table 的某些记录中获取几列,并从 CH
table 的关联记录中获取几列。 问题:如何使用以下 LINQ 查询将这些记录加载到以下 ViewModel
? 注意:我可以使用常规的 LINQ Join 等来完成它,但很好奇我们如何使用 Eager Loading
ViewModel:
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_CH_ViewModel
并 return 作为列表
....
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);
查看:
@model List<PT_CH_ViewModel>