2016-11-27 3 views
1

У меня есть класс модели, который содержит свойство ProductPrice типа decimal. Я не могу хранить тип IQueryable для десятичного значения. Я даже пытался преобразовать. ToDecimal, но он все еще показывает мне ошибку.IQueryable <decimal> to decimal

Модель - продукт

public class Product 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 
    public decimal ProductPrice { get; set; } 
    public int ProductQty { get; set; } 
} 

Модель CartDispay

public class CartDisplay 
{ 
    public int ItemId { get; set; } 
    public String ProductName { get; set; } 
    public int ProductQty { get; set; } 
    public decimal ProductPrice { get; set; } 
} 

Контроллер

public ActionResult Index() 
    { 
     int userId = 3; 
     var items = _context.Cart.Join(_context.Items, c => c.CartId, i => i.CartId, (c, i) => new { c, i }).Where(c => c.c.UserId == userId).ToList(); 
     foreach(var item in items) 
     { 
      CartDisplay display = new CartDisplay(); 
      display.ItemId = item.i.ItemId; 
      display.ProductName = _context.Product.Where(p => p.ProductId == item.i.ProductId).Select(p => p.ProductName).ToString(); 
      display.ProductPrice = _context.Product.Where(p => p.ProductId == item.i.ProductId).Select(p => p.ProductPrice); ; 
      display.ProductQty = item.i.ProductQty; 
      cartView.CartDisplay.Add(display); 
     } 
     retu 
+3

Почему вы ожидаете чтобы иметь возможность хранить 'IQueryable ' в 'decimal'? Один описывает запрос, который описывает фактическое значение. Возможно, вам нужно добавить '.FirstOrDefault()' в конце вашего запроса, но это полностью зависит от вашей бизнес-логики. – Rob

+3

FirstOrDefault вместо Where .. –

+0

_context.Product.Where (p => p.ProductId == item.i.ProductId) .Выберите (p => p.ProductPrice); это может вернуть несколько записей, и поскольку ваша модель CartDisplay имеет только ProductPrice (а не сбор), вы можете получить эту ошибку. Вы можете использовать FirstOrDefault(), который дает первое значение из возвращенной коллекции. или вы можете изменить свою модельную структуру. –

ответ

0

IQueryable<T> определяет последовательность элементов типа T, а не один элемент. Он также позволяет выполнять дополнительные запросы, не внося последовательность в память, но это не важно в контексте вашего вопроса.

Ваша ситуация намного проще, хотя: вместо запроса для отдельных свойств, вы должны запросить для всего продукта по его идентификатору, а затем взять свои индивидуальные свойства, например:

var prod = _context.Product.SingleOrDefault(p => p.ProductId == item.i.ProductId); 
if (prod != null) { 
    display.ProductName = prod.ProductName 
    display.ProductPrice = prod.ProductPrice; 
    display.ProductQty = ... 
} else { 
    // Product with id of item.i.ProductId does not exist 
}