產品
public int Id { get; set; }
public string ProductName { get; set; }
public string ProductDescription { get; set; }
public Category Category {get; set;}
類別
public int Id { get; set; }
public string CategoryName { get; set; }
public string CategoryDescription { get; set; }
public Product Product{get; set;}
產品視圖模型
public int Id { get; set; }
public string ProductName { get; set; }
public string ProductDescription { get; set; }
public Category Category {get; set;}
控制器
public IActionResult GetProducts()
{
using var dbContext = new DatabaseContext();
var result = dbContext.Products.Where(i => i.Id == id)
.ThenInclude(i => i.Category)
.ToList();
List<ProductViewModel> productList = new List<ProductViewModel>();
foreach(var item in result)
{
var model = ProductViewModel()
{
Id = item.Id,
ProductName = item.ProductName,
ProductDescription = item.ProductDescription,
Category = new Category()
{
// Error: item.Category.CategoryName = 'item.Category.CategoryName' threw an
exception of type 'System.NullReferenceException'
CategoryName= item.Category.CategoryName,
CategoryDescription = item.Category.CategoryDescription,
Id = item.Category.Id
}
productList.Add(model);
}
}
如何忽略 DTO 類中的空值。
我從資料庫中獲取我的產品。由于某些產品中的類別為空,因此在將其映射到我的 DTO 類時出現錯誤。
uj5u.com熱心網友回復:
用于Select將模型投影到 DTO。它將創建最佳 SQL,并應避免將不需要的資料加載到記憶體中。EF 也應該自動解決可空性問題。
public IActionResult GetProducts()
{
using var dbContext = new DatabaseContext();
var productList = dbContext.Products
.Where(i => i.Id == id)
.Select(item => new ProductViewModel
{
Id = item.Id,
ProductName = item.ProductName,
ProductDescription = item.ProductDescription,
Category = new Category
{
CategoryName = item.Category.CategoryName,
CategoryDescription = item.Category.CategoryDescription,
Id = item.Category.Id
}
})
.ToList();
...
}
uj5u.com熱心網友回復:
@Svyatoslav Danyliv 的答案是您問題的干凈解決方案!但是,在您當前的解決方案中,我對您的例外情況的猜測低于我的猜測。
我認為這是因為您正在使用ThenInclude. ThenInclude通常在您需要更深入地包含時使用。
示例:人類 --> 頭部 --> 眼睛
dbContext.Humans.Include(x => x.Head).ThenInclude(x => x.Eye);
您調整后的代碼:
var result = dbContext.Products.Include(i => i.Category).Where(i => i.Id == id).ToList();
更改ThenInclude并Include嘗試一下!:)
uj5u.com熱心網友回復:
您好,您可以嘗試使用 ??= 運算子,它可以保護您免受空參考例外的影響
using var dbContext = new A1APPsContext();
var result = dbContext.Products.Where(i => i.Id == id)
.Include(i => i.Category)
.ToList();
List<ProductViewModel> productList = new List<ProductViewModel>();
foreach (var item in result)
{
item.Category ??= new Category();
var model = new ProductViewModel()
{
Id = item.Id,
ProductName = item.ProductName,
ProductDescription = item.ProductDescription,
Category = new Category()
{
CategoryName = item.Category.CategoryName,
CategoryDescription = item.Category.CategoryDescription,
Id = item.Category.Id
}
};
productList.Add(model);
}
在這種情況下,您還可以提供“無類別”類別名稱,并且只有在您沒有類別時才能通過在類中應用它來獲得它
public class Category
{
public int Id { get; set; }
public string CategoryName { get; set; } = "No Category";
public string CategoryDescription { get; set; }
public Product Product { get; set; }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442862.html
上一篇:將for回圈轉換為linq
