【问题标题】:Linq Query keeps throwing "Unable to create a constant value of type System.Object....", Why?Linq Query 不断抛出“无法创建 System.Object 类型的常量值......”,为什么?
【发布时间】:2011-06-03 07:23:31
【问题描述】:

以下是代码示例:

private void loadCustomer(int custIdToQuery) 
    {
        var dbContext = new SampleDB();
        try
        {
            var customerContext = from t in dbContext.tblCustomers      // keeps throwing:
                                   where t.CustID.Equals(custIdToQuery) // Unable to create a constant value of type 'System.Object'. 
                                   select new                           // Only primitive types ('such as Int32, String, and Guid') 
                                   {                                    // are supported in this context.
                                       branchId = t.CustomerBranchID,   //
                                       branchName = t.BranchName        //
                                   };                                   //

            if (customerContext.ToList().Count() < 1) //Already Tried customerContext.Any()
            {
                lstbCustomers.DataSource = customerContext;
                lstbCustomers.DisplayMember = "branchName";
                lstbCustomers.ValueMember = "branchId";
            }
            else
            {
                lstbCustomers.Items.Add("There are no branches defined for the selected customer.");
                lstbCustomers.Refresh();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            dbContext.Dispose();
        }
    }

我无法理解我做错了什么。我不断收到“无法创建类型为“System.Object”的常量值。在此上下文中仅支持原始类型(“例如 Int32、String 和 Guid”)。”

【问题讨论】:

    标签: c# .net winforms linq entity-framework


    【解决方案1】:

    使用 == 代替 Equals:

    where t.CustID == custIdToQuery
    

    如果类型不正确,您可能会发现它无法编译。

    【讨论】:

    • 您能否解释一下“t.CustID == custIdToQuery”和“t.CustID.Equals(custIdToQuery)”之间的区别。提前致谢
    • @Neel 看看这个问题,了解==.Equals() 之间的区别:stackoverflow.com/questions/814878/…
    • 2011 年解决方案逻辑适用于 2018 年!真棒值得!
    【解决方案2】:

    当我尝试使用可以为空的小数执行 .Equals 时,我遇到了同样的问题。使用 == 效果很好。我想这是因为它没有尝试匹配十进制的确切“类型”?到十进制。

    【讨论】:

    • 请记住,这是在 IQueryable 的上下文中,因此它不会编译成常规的 C# 代码。它成为传递给查询提供程序的表达式。该查询提供程序可以对查询做任何想做的事情,它可以处理Equals== 相同或不同。
    • 我用.Equal() 来比较Int32?Int32。由于Int32? 应该包含Int32null,我认为它会起作用。但它没有。 == 工作。
    【解决方案3】:

    我在可空的 int 上遇到了同样的问题。使用 == 效果很好,但如果你想使用 .Equals,你可以将它与可空变量的值进行比较,所以

    where t.CustID.Value.Equals(custIdToQuery)
    

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题,我将 Collection Object "User" 与整数数据类型 "userid" (x.User.Equals(userid)) 进行比较

      from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.User.Equals(userid))
      

      正确的查询是x.UserId.Equals(userid)

      from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.UserId.Equals(userid))
      

      【讨论】:

      • 这是一个不同的问题,你在比较苹果和橘子。
      • 有何不同。虽然我遇到了同样的问题。我只是发布这个答案仅供他人参考。
      【解决方案5】:

      就我而言,我将(sender as Button).Text 的直接调用更改为使用临时变量的间接调用,已经奏效。 工作代码:

      private void onTopAccBtnClick(object sender, EventArgs e)
          {
              var name = (sender as Button).Text;
              accountBindingSource.Position =
                          accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == name));
              accountBindingSource_CurrentChanged(sender, e);
          }
      

      错误代码:

      private void onTopAccBtnClick(object sender, EventArgs e)
          {
              accountBindingSource.Position =
                          accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == (sender as Button).Text));
              accountBindingSource_CurrentChanged(sender, e);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        相关资源
        最近更新 更多