2011-01-04 23 views
72

El siguiente es el ejemplo de código:Linq Query sigue lanzando "No se puede crear un valor constante de tipo System.Object ....", ¿Por qué?

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(); 
     } 
    } 

Soy incapaz de entender lo que estoy haciendo mal. Sigo recibiendo "No se puede crear un valor constante de tipo 'System.Object'. Solo los tipos primitivos ('como Int32, String y Guid') son compatibles en este contexto."

Respuesta

170

Uso == en lugar de iguales:

where t.CustID == custIdToQuery 

Si los tipos son incorrectos es posible que esto no se compila.

+2

gracias LinQ hombre me está dando un tiempo duro :( – Neel

+9

¿Puede explicar la diferencia entre "t.CustID == custIdToQuery" y "t.CustID.Equals (custIdToQuery)". gracias de antemano – Neel

+0

@Neel Eche un vistazo a esta pregunta para obtener una explicación sobre la diferencia entre '==' y '.Equals()': http://stackoverflow.com/questions/814878/c-sharp-difference-between- y equivale a – Alex

7

Tuve el mismo problema cuando estaba tratando de hacer .Equals con un decimal con nulos. Usar == en su lugar funciona bien. Supongo que esto se debe a que no intenta hacer coincidir exactamente el "tipo" de decimal. a decimal

+4

Tenga en cuenta que esto está en el contexto de un 'IQueryable', por lo que no se compila en el código C# normal. Se convierte en una expresión que se pasa a un proveedor de consultas. Ese proveedor de consultas puede hacer lo que quiera con la consulta, y puede manejar 'Iguales' y' == 'igual o no. – Servy

+0

He usado '.Equal()' para comparar 'Int32?' Con 'Int32'. Ya que 'Int32?' Se supone que contiene 'Int32' y' null', pensé que funcionaría. Pero no fue así. '==' funcionó. – matrix

21

Tuve el mismo problema con una int nullable. El uso de == lugar funciona muy bien, pero si desea utilizar .equals, que se puede comparar con el valor de la variable anulable, por lo

where t.CustID.Value.Equals(custIdToQuery) 
-1

que se enfrentó el mismo problema y estaba comparando con objeto de colección tipo de datos entero "userid" (x.User.Equals(userid))

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

y Query es correcta x.UserId.Equals(userid)

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

Este es un problema diferente, estás comparando manzanas y naranjas. –

+0

cómo es diferente. mientras que he enfrentado el mismo problema. Acabo de publicar esta respuesta solo como referencia para otros. –

Cuestiones relacionadas