InvalidCastException:无法将类型为System.Double的对象转换为类型为System.Single的对象

时间:2020-08-12 15:44:14

标签: asp.net-core asp.net-core-mvc

我正在尝试获取ASP.NET中的Food列表。我创建了一个模型菜单和一个模型 listMenu ,以在 Menucontroller 中获取列表。我有以下代码,但出现此错误:InvalidCastException:无法将类型为“ System.Double”的对象转换为类型为“ System.Single”。

我不知道问题是否出在数据库方面,还是不是从表中读取的

MenuController:

public async Task<IActionResult> Index(string searchString)
{               
    var foods = from m in _context.Menu
                            select m;
    
    if (!string.IsNullOrEmpty(searchString))
    {
        foods = foods.Where(s => s.Name.Contains(searchString));
    }
    var foodlist = new ListMenu
    {
        Foods = await foods.ToListAsync()
    };
    
    return View(foodlist);
}

菜单型号:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
    
namespace Resto.Models
{
    public class Menu
    {
        [Key]
        public string Name { get; set; }
    
        public float Price { get; set; }
    }
}

ListMenu模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
    
namespace Resto.Models
{
    public class ListMenu
    {
        public List<Menu> Foods { get; set; }
        public string SearchString { get; set; }
    }
}

2 个答案:

答案 0 :(得分:0)

InvalidCastException:无法将类型为“ System.Double”的对象强制转换为 键入“ System.Single”。

此问题与C#数据类型和SQL Server列数据类型不匹配有关。

下表列出了C#数据类型到SQL Server列数据类型之间的映射。

enter image description here

根据您的代码,由于Menu的Price属性为float类型,如果您在SQL数据库中使用float类型,它将显示“无法转换类型为'System'的对象。双击以输入“ System.Single”错误。

要解决此错误,请尝试将“菜单表价格”列数据类型更改为 real (在模型中,使用浮点数据类型)

enter image description here

或者,将菜单模型Price属性数据类型更改为 Double (在数据库中,您可以使用浮点列数据类型)。

public class Menu
{
    [Key]
    public string Name { get; set; }
    public double Price { get; set; }
}

答案 1 :(得分:0)

Zhi Lv 的回答是正确的,但另外 SQL 有两种不同级别的浮点精度,可以转换为两种不同的 C# 数据类型。 float 默认为 'float(53)' 并匹配 C# 'double'。 但是,SQL 'float(24)' 转换为 C# 'float'。所以在你的情况下,你希望你的 SQL 类型是 'float(24)'(或者如志所说,将你的 C# 改为 double)。