我有 3 個模型:Human,Skill和HumanSkill. Human和之間是多對多的關系Skill,HumanSkill是它們之間的中介表。
我對資料庫的查詢HumanSkill正確加載了中間表的集合,但沒有加載參考導航屬性Skill,我想通過它使用帶有選擇的查詢投影加載Skill名稱 ( Human -> HumanSkill -> Skill -> Skill.name)。
public IActionResult Preview(int humanId)
{
var currentHuman = this.db.Humans
.Where(x => x.Id == humanId)
.Select(r => new HumanPreviewViewModel
{
PrimaryData = r.PrimaryData,
// How should I write this line?
Skills = r.Skills.ToList(),
}).SingleOrDefault();
return View(currentResume);
}
人體模型:
public class Human
{
public Human()
{
this.Skills = new HashSet<HumanSkill>();
}
public int Id { get; set; }
public virtual PrimaryData PrimaryData { get; set; }
public virtual ICollection<HumanSkill> Skills { get; set; }
}
HumanSkill 模型:
public class HumanSkill
{
public int Id { get; set; }
public int HumanId { get; set; }
public Human Human { get; set; }
public int SkillId { get; set; }
public Skill Skill { get; set; }
}
技能模型:
public class Skill
{
public Skill()
{
this.Humans = new HashSet<HumanSkill>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<HumanSkill> Humans { get; set; }
}
HumanPreviewViewModel:
public class HumanPreviewViewModel
{
public HumanPreviewViewModel()
{
}
public PrimaryData PrimaryData { get; set; }
public List<HumanSkill> Skills { get; set; }
}
}
uj5u.com熱心網友回復:
如何在不使用 include 的情況下實作這一目標?
如果您在 Select 中使用 Skills 表中的一些資料,EF 將執行必要的連接以檢索資料
var currentHuman = this.db.Humans
.Where(x => x.Id == humanId)
.Select(r => new HumanPreviewViewModel
{
PrimaryData = r.PrimaryData,
SkillNames = r.Skills.Select(hs => hs.Skill.Name).ToList(),
}).SingleOrDefault();
uj5u.com熱心網友回復:
當從物體投影到視圖模型時,避免混合它們。例如,沒有一個視圖模型包含一個參考或一組物體。雖然這似乎沒有必要,但如果您想要在 HumanPreviewViewModel 中列出帶有 ID 和名稱的技能,然后為該技能以及 PrimaryData 創建一個可序列化的視圖模型(如果它是另一個相關物體)。在 PrimaryData 可能是一對一或多對一的情況下,這種關系的所需屬性可以“展平”到視圖模型中。
[Serializable]
public class HumanPreviewViewModel
{
public Id { get; set; }
public string DataPoint1 { get; set; }
public string DataPoint2 { get; set; }
public List<SkillViewModel> Skills { get; set; }
}
[Serializable]
public class SkillViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
然后當你去提取你的人類時:
var currentHuman = this.db.Humans
.Where(x => x.Id == humanId)
.Select(r => new HumanPreviewViewModel
{
Id = r.Id,
DataPoint1 = r.PrimaryData.DataPoint1,
DataPoint2 = r.PrimaryData.DataPoint2,
Skills = r.Skills.Select(s => new SkillViewModel
{
Id = s.Skill.Id,
Name = s.Skill.Name
}).ToList()
}).SingleOrDefault();
即使視圖模型和物體共享所有所需欄位,也不將它們混合使用的原因是,您的物體通常會包含對更多物體的參考。當您的視圖模型之類的東西被發送到序列化程式時,例如從 API 發送到客戶端,或者由于頁面呼叫了一些看似無辜的東西:
var model = @Html.Raw(Json.Encode(Model));
然后序列化程式可以,并且將觸摸您參考的物體中的導航屬性,這將觸發大量延遲加載呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/382040.html
上一篇:如何為dotnetC#MVC路由配置ApacheProxyPass和ProxyReverse以獲得.well-known的例外
下一篇:如何在firefox中設定browser.helperApps.neverAsk.saveToDisk以避免使用Selenium匯出Protonmail電子郵件時出現下載彈出視窗
