1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
通常,延遲加載會在幕后處理此問題,但如果您沒有啟用或可用(EF Core 2.1 之前的版本),您將留下 #null 引用。
選項(xiàng):
1) 預(yù)加載權(quán)限.Include(x => x.Permissions)。
正如法比奧上面評論的那樣,這應(yīng)該可以解決您眼前的問題。急切加載的考慮因素是您必須顯式包含您想要引用的所有內(nèi)容,這可能意味著加載比您需要的更多的數(shù)據(jù)。
2)用于Select獲取您需要的數(shù)據(jù)。
通過利用,Select您可以消除對急切加載或延遲加載命中的擔(dān)憂,并生成經(jīng)過優(yōu)化以僅返回您關(guān)心的數(shù)據(jù)的 SQL。如果您想要根據(jù)數(shù)據(jù)狀態(tài)執(zhí)行某些邏輯,您可以使用匿名類型來表示數(shù)據(jù)。在其他情況下,您想要將數(shù)據(jù)返回到視圖,請使用 Select (或 Automapper 的ProjectTo)來填充視圖模型。
例如:
[HttpPost]
public IActionResult Login(LoginViewModel loginViewModel)
{
loginViewModel.plainTextPassword = loginViewModel.user.Password;
var userInfo = _context.Users.Where(x => x.Email == loginViewModel.user.Email)
.Select(x => new
{
x.UserId,
x.FirstName,
x.LastName,
x.Password,
IsAdmin = x.Permissions.Admin
}).SingleOrDefault();
if (userInfo == null)
{
ViewBag.Error = "Sorry, but we couldn't log you in.";
return View();
}
else if (Hashing.Confirm(loginViewModel.plainTextPassword, userInfo.Password, Supported_Ha.SHA256))
{
HttpContext.Session.SetString("UserFirstName", userInfo.FirstName);
HttpContext.Session.SetString("UserLastName", userInfo.LastName);
HttpContext.Session.SetInt32("UserUserId", userInfo.UserId);
HttpContext.Session.SetString("IsAdmin", userInfo.IsAdmin.ToString());
ViewBag.IsAdmin = userInfo.IsAdmin.ToString();
ViewBag.SessionUserName = userInfo.FirstName;
return RedirectToAction("Index");
}
ViewBag.Error = "Sorry, but we couldn't log you in.";
return View("Index");
}
主題演講:我們使用 Select 只檢索我們需要的用戶列(名稱、ID、密碼哈希)以及權(quán)限引用中的“admin”標(biāo)志。它被加載到一個(gè)臨時(shí)容器中,我們可以在此方法中引用它。每當(dāng)您需要單行而不是/時(shí),最好使用Single/ ,因?yàn)榭梢云帘我馔獾闹貜?fù)數(shù)據(jù)場景。IMO /切勿在沒有子句的情況下使用,以確保結(jié)果一致。SingleOrDefaultFirstFirstOrDefaultFirstFirstOrDefaultOrderBy
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)