Ошибка приведения к типу значения 'Десятичная', поскольку материализованное значение равно нулю
У меня есть следующий код:
public ViewResult Stock(Guid id)
{
// Get the product form the database
var product = productRepository.GetById(id);
var viewModel = new ProductStockViewModel()
{
Product = product,
ProductStoreStock = storeDB.Stores.Select(store => new ProductStoreStockViewModel()
{
Store = store,
Bought = storeDB.Stocks
.Where(s => s.StoreId == store.StoreId)
.Where(p => p.ProductId == product.ProductId)
.Sum(s => s.Quantity),
Sold = storeDB.OrderDetails
.Where(o => o.Order.StoreId == store.StoreId)
.Where(o => o.ProductId == product.ProductId)
.Sum(s => s.Quantity)
})
.ToList()
};
return View(viewModel);
}
public class ProductStoreStockViewModel
{
public Store Store { get; set; }
//public Product Product { get; set; }
public decimal Bought = 0;
public decimal Sold = 0;
public decimal Stock
{
get { return Bought - Sold; }
}
}
Я понял ошибку, иногда продукт был продан 0 раз, поэтому.Sum(s => s.Quantity) возвращает нулевое значение. Я знаю, я могу использовать?? 0, если это условие выполняется, но какой самый элегантный способ выразить это в синтаксисе метода Linq?
1 ответ
Ваша проблема может быть в том случае, если storeDB.Stocks равен нулю или storeDB.OrderDetails равен нулю (но здесь вы получите нулевое исполнение). Другим способом, вы можете удалить 1 где в вашем запросе для более элегантного кода, как это
Sold = storeDB.OrderDetails
.Where(o => o.Order.StoreId == store.StoreId && o.ProductId == product.ProductId)
.Sum(s => s.Quantity)
И, как сказал Седрик Биньон, "Продано" будет "0", если запрос пустой, но не нулевой.