asp.net-mvc - 在 EF MVC 中应用左内连接
问题描述
我有以下 SQL 语法:
select a.year, a.Month,
a.DocumentNumber, b.BoxNumber,
c.LocationShortName, d.RackShortName
from MasterAP a
left join RecordManagementAP b on a.MasterAPID = b.MasterAPID
left join MasterLocation c on b.LocationID = c.LocationID
left join MasterRack d on b.RackID = d.RackID
where a.Month = '2'
如何将该语法应用于 MVC 中的 EF 语法?我目前在 EF 中的语法是:
var recordManagementAPs = db.RecordManagementAPs.Include(r => r.MasterAP).Include(r => r.MasterLocation).Include(r => r.MasterRack);
return View(recordManagementAPs.ToList());
任何想法?
非常感谢。
谢谢你。
解决方案
投影。
为视图的数据声明一个视图模型。(而不是传递实体。)
[Serializable]
public class RecordDetailViewModel
{
public int MasterAPId { get; set; }
public string Year { get; set; }
public string Month { get; set; }
public string DocumentNumber { get; set; }
public string BoxNumber { get; set; }
public string LocationShortName { get; set; }
public string RackShortName { get; set; }
}
将您的实体查询投影到视图模型中并返回:
var viewModels = db.MasterAPs
.Where(x => x.Month == month) // "2"
.Select(x => new RecordDetailViewModel
{
MasterAPId = x.MasterAPId,
Year = x.Year,
Month = x.Month,
DocumentNumber = x.DocumentNumber,
BoxNumber = x.RecordManagementAP.BoxNumber,
LocationShortName = x.MasterLocation.LocationShortName,
RackShortName = x.MasterRack.RackShortName
}).ToList();
假设您的实体关系已被映射。
Include
当您返回整个实体并希望预取相关实体(包括它们)而不是在访问它们时延迟加载它们时,使用该关键字。通常,当您想要执行更新之类的操作时,您应该只检索实体(和相关实体),您可以在其中接受视图模型或要从视图更新的一组字段,加载实体并在保存之前应用更新实体。不要将实体传递给视图。这会暴露比您需要的有关域的更多信息,需要更多内存,并且在序列化关系时可能导致错误或性能缺陷。从视图中接收实体更糟糕,因为它会使您的系统容易受到意外篡改、潜在的附加引用错误以及用过时的更改覆盖数据的影响。
推荐阅读
- python-3.x - 如何以给定长度的字符串输入字符串?
- android - 如何在不被截断的情况下在 Android 中实现柔光箱阴影?
- java - 如何在 RecyclerView.Adapter 中打开片段以让用户转到其他用户个人资料
- git - 无法创建 /path/.git/index.lock :权限被拒绝
- jquery - Ajax/Json MVC 表填充不起作用
- android - 在 Android Oreo 上使用 su 权限在 init.rc 中启动本机守护进程
- javascript - Es6使用传播合并两个对象不起作用
- java - java.lang.IllegalArgumentException:不支持行:接口 TargetDataLine 支持格式 PCM_SIGNED 44100.0 Hz,
- bash - 如何阻止 git 将非错误写入 stderr
- python-3.x - 列表中最长的递增序列