LinqPad 转换错误
LinqPad conversion error
我在 DuplicateOrder(TestOrder) 上收到一个错误 "cannot convert from tables.Order to int",即使订单 table 中的 OrderID 是一个整数
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));
}}
我在这里错过了什么?
根本原因,下行中的 FirstOrDefault
将 return 第一个 order
对象或空值。
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).FirstOrDefault();
所以 testOrder
的类型是 order
,但是下面的方法调用需要 int
参数。
DuplicateOrder(TestOrder);
这就是你得到 -
的原因
cannot convert from tables.Order to int
要解决此问题,您需要在 Linq 查询中添加 Select 查询,并在 int
列中添加 select,如下所示 -
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).Select(s=> s.YourIntColumn).FirstOrDefault();
编辑:
看完你整个方法和别人的评论,你的方法调用肯定会死循环。由于您没有提到这段代码的用途,我只是假设您想查看特定的 orderid
在数据库中是否重复。为此,您可以只使用 Count
查询和 return 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
}
}
如果您在代码中正确编码,并且如果对于给定的 orderId 有一个订单,那么您的方法将导致无限循环。话虽如此,以下是获取 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()。不同之处在于,如果数据库中有超过 1 个具有给定 orderId 的条目,SingleOrDefault() 会抛出错误 - 如果是主键,这就是您想要的。
我在 DuplicateOrder(TestOrder) 上收到一个错误 "cannot convert from tables.Order to int",即使订单 table 中的 OrderID 是一个整数
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));
}}
我在这里错过了什么?
根本原因,下行中的 FirstOrDefault
将 return 第一个 order
对象或空值。
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).FirstOrDefault();
所以 testOrder
的类型是 order
,但是下面的方法调用需要 int
参数。
DuplicateOrder(TestOrder);
这就是你得到 -
的原因cannot convert from tables.Order to int
要解决此问题,您需要在 Linq 查询中添加 Select 查询,并在 int
列中添加 select,如下所示 -
var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).Select(s=> s.YourIntColumn).FirstOrDefault();
编辑:
看完你整个方法和别人的评论,你的方法调用肯定会死循环。由于您没有提到这段代码的用途,我只是假设您想查看特定的 orderid
在数据库中是否重复。为此,您可以只使用 Count
查询和 return 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
}
}
如果您在代码中正确编码,并且如果对于给定的 orderId 有一个订单,那么您的方法将导致无限循环。话虽如此,以下是获取 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()。不同之处在于,如果数据库中有超过 1 个具有给定 orderId 的条目,SingleOrDefault() 会抛出错误 - 如果是主键,这就是您想要的。