我在DuplicateOrder(TestOrder)上遇到错误,因为“无法从table.Order转换为int”,即使Orders表中的OrderID为int
void DuplicateOrder(int orderId)
{
string methodName = MethodBase.GetCurrentMethod().Name;
try {
using (MSBLegacyContext db = new MSBLegacyContext())
{
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).FirstOrDefault();
DuplicateOrder(TestOrder);
}
}
catch (Exception ex)
{
Console.WriteLine(methodName, ex, string.Format("Test", orderId));
}}
我在这里想念什么?
答案 0 :(得分:2)
根本原因,下面一行中的FirstOrDefault
将返回第一个order
对象或null。
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).FirstOrDefault();
所以testOrder
的类型是order
,但是下面的方法调用期望使用int
参数。
DuplicateOrder(TestOrder);
这就是你得到的原因-
无法从表格转换。顺序为int
要解决此问题,您需要在Linq查询中添加Select查询,然后选择int
列,如下所示-
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).Select(s=> s.YourIntColumn).FirstOrDefault();
编辑:
在查看了整个方法和其他人的评论之后,您的方法调用肯定会进入无限循环。正如您没有提到此代码的目的,我只是假设您要查看数据库中特定的orderid
是否重复。为此,您只需使用Count
查询并返回Boolean
值即可。 (不确定为什么在方法签名中有void
)
bool DuplicateOrder(int orderId) // changed from void to bool
{
using (MSBLegacyContext db = new MSBLegacyContext())
{
return db.Orders.Where(i=>i.OrderID == orderId).Count()>1; // returns true if more than 1 order found
}
}
答案 1 :(得分:2)
如果您已经在代码中正确地对其进行了编码,并且对于给定的orderId有一个Order,则您的方法将导致无限循环。话虽如此,下面是获取int OrderId值的正确方法:
using (MSBLegacyContext db = new MSBLegacyContext())
{
var TestOrder = db.Orders
.FirstOrDefault(i=>i.OrderID == orderId);
if (TestOrder != null)
{
var orderId = TestOrder.OrderId;
// ...
}
// else whatever you would do
}
如果OrderId是主键,则应使用SingleOrDefault()而不是FirstOrDefault()。区别在于,如果数据库中具有给定orderId的条目多于1个,SingleOrDefault()会引发错误-对于主键,这就是您想要的。