0

私は次のコードを持っています:

    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; }
    }
}

私はエラーを理解しています.Sum(s => s.Quantity)がnull値を返すように、製品が0回販売されていることがあります。私は使用できることを知っていますか?? その条件が満たされている場合は0ですが、Linqメソッド構文でそれを表現する最もエレガントな方法は何ですか?

4

1 に答える 1

0

「storeDB.Stocks」がnullまたは「storeDB.OrderDetails」がnullの場合に問題が発生する可能性があります(ただし、ここではnullの実行が発生します)。他の方法では、次のように、クエリで 1 where を削除して、より洗練されたコードにすることができます

Sold = storeDB.OrderDetails
                .Where(o => o.Order.StoreId == store.StoreId && o.ProductId == product.ProductId)
                .Sum(s => s.Quantity)

Cédric Bignon が言ったように、クエリが空で null でない場合、「販売済み」は「0」になります。

于 2013-01-28T12:10:30.690 に答える