【问题标题】:LinqPad conversion errorLinqPad 转换错误
【发布时间】:2018-07-24 19:41:18
【问题描述】:

我在 DuplicateOrder(TestOrder) 上收到一个错误,因为“无法从 tables.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));
        }}

我在这里错过了什么?

【问题讨论】:

  • 你想达到什么目的?请注意,WhereFirstOrDefault 都不会更改原始类型(tables.Order 的集合将导致返回 tables.Order 的单个(或空)实例,因此您需要自己提取 OrderId 属性。跨度>
  • 应该是DuplicateOrder(TestOrder.OrderId);
  • @Chad 那是我没有得到的部分,这是一个没有停止的递归调用。
  • 因为你的 testOrder 是 Order 类型并且要注意你的方法是递归的,如果没有错误会导致无限循环。
  • 此代码强烈表明您缺少具有 Order 类型参数的方法 DuplicateOrder。此代码不能是递归的。那么问题来了:缺少的方法在哪里?

标签: c# linq dbcontext linqpad


【解决方案1】:

根本原因,下一行中的 FirstOrDefault 将返回第一个 order 对象或 null。

var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).FirstOrDefault();

所以testOrder 的类型是order,但下面的方法调用需要int 参数。

DuplicateOrder(TestOrder);

这就是你得到的原因 -

无法从tables.Order 转换为int

要解决此问题,您需要在 Linq 查询中添加 Select 查询并选择 int 列,如下所示 -

var TestOrder = db.Orders.Where(i=>i.OrderID == orderId).Select(s=> s.YourIntColumn).FirstOrDefault();

编辑: 在查看了您的整个方法和其他人的 cmets 之后,您的方法调用肯定会进入无限循环。由于您没有提到此代码的目的,我只是假设您想查看特定的 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   
  }
}

【讨论】:

    【解决方案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()。不同之处在于,如果数据库中有超过 1 个具有给定 orderId 的条目,SingleOrDefault() 会抛出错误 - 对于主键,这就是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多