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() 会抛出错误 - 如果是主键,这就是您想要的。