IQueryable<decimal> 转十进制

Posted

技术标签:

【中文标题】IQueryable<decimal> 转十进制【英文标题】:IQueryable<decimal> to decimal 【发布时间】:2017-04-11 15:08:10 【问题描述】:

我有一个模型类,其中包含十进制类型的属性 ProductPrice。我无法将 IQueryable 类型存储到属性小数。我什至尝试过 Convert.ToDecimal 但它仍然显示错误。

模型 - 产品

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

【问题讨论】:

您为什么希望能够将IQueryable&lt;decimal&gt; 存储到decimal 中?一个描述查询,一个描述实际值。也许您想在查询末尾添加.FirstOrDefault(),但这完全取决于您的业务逻辑。 FirstOrDefault 而不是 Where.. _context.Product.Where(p => p.ProductId == item.i.ProductId).Select(p => p.ProductPrice);这可能会返回多条记录,并且由于您的模型 CartDisplay 只有 ProductPrice (不是集合),您可能会收到此错误。您可以使用 FirstOrDefault() 从返回的集合中给出第一个值。或者你可以改变你的模型结构。 【参考方案1】:

IQueryable&lt;T&gt; 定义了T 类型的元素序列,而不是单个项目。它还允许您在不将序列放入内存的情况下执行其他查询,但这在您的问题上下文中并不重要。

不过,您的情况要简单得多:与其查询单个属性,不如通过 ID 查询整个产品,然后获取其各个属性,如下所示:

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

【讨论】:

以上是关于IQueryable<decimal> 转十进制的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable 和 IQueryable<T> 是异步的吗?

以更好的性能将 IQueryable<X> 转换为 IQueryable<Y>

返回 IEnumerable<T> 与 IQueryable<T>

返回 IEnumerable<T> 与 IQueryable<T>

IList<T> 到 IQueryable<T>

IQueryable 和 IEnumerable