我正在尝试获取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; }
}
}
答案 0 :(得分:0)
InvalidCastException:无法将类型为“ System.Double”的对象强制转换为 键入“ System.Single”。
此问题与C#数据类型和SQL Server列数据类型不匹配有关。
下表列出了C#数据类型到SQL Server列数据类型之间的映射。
根据您的代码,由于Menu的Price属性为float
类型,如果您在SQL数据库中使用float
类型,它将显示“无法转换类型为'System'的对象。双击以输入“ System.Single”错误。
要解决此错误,请尝试将“菜单表价格”列数据类型更改为 real
(在模型中,使用浮点数据类型)
或者,将菜单模型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)。