LinqPad转换错误

时间:2018-07-24 19:41:19

标签: c# linq dbcontext linqpad

我在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));
        }}

我在这里想念什么?

2 个答案:

答案 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()会引发错误-对于主键,这就是您想要的。