Ошибка приведения к типу значения 'Десятичная', поскольку материализованное значение равно нулю

У меня есть следующий код:

    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", если запрос пустой, но не нулевой.

Другие вопросы по тегам