2012-02-17 12 views
7

Tenemos un nuevo desarrollador que acaba de aprender LinqToSql. Al revisar su código, notamos que estaba usando .Equals en lugar de == para una comparación de valores. Además de eso, está comparando un int con un string. Lo que nos desconcertó por completo fue que funcionó.Linq to SQL .Equals devuelve true al comparar int con string -> Id.Equals ("5") devuelve true

Después de algunas pruebas, parece que solo funciona con LinqToSql. Linq to objects returns false y simplemente haciendo int.Equals(“string”) devuelve false.

continuación se presenta una prueba simple utilizando dos tablas SQL:

Customer 
    Id(PK)(int) 
    Name(varchar) 
    CompanyId(FK)(int) 


Company 
    Id(PK)(int) 
    Name(varchar) 
Console.WriteLine("{0}.Equals(\"{1}\") returns {2}", 3, "3", 3.Equals("3")); 
     using (WrDataClassesDataContext wrDataContext = new WrDataClassesDataContext()) 
     { 
      var customers1 = from c in wrDataContext.Customers 
          where c.CompanyId.Equals("3") 
          select c; 

      Console.WriteLine("int .Equals String Results: "); 
      foreach (Customer customer in customers1) 
      { 
       Console.WriteLine(customer.Name); 
      } 

      var customers3 = from c in wrDataContext.Customers 
         where c.CompanyId == 3 
         select c; 

      Console.WriteLine("int == int Results: "); 
      foreach (Customer customer in customers3) 
      { 
       Console.WriteLine(customer.Name); 
      } 
     } 

RESULTADOS:

3.Equals("3") returns False 
int .Equals String Results: 
Mike 
Joe 
Candy 
int == int Results: 
Mike 
Joe 
Candy 
Press any key to continue . . . 

Cualquier explicación?

+0

una nota importante sobre el uso de == versus .Equals() en LinqToSql, http://stackoverflow.com/questions/8105732/ef-4-1-linq-to-sql-what-is-better -using-equal-or –

Respuesta

11

LINQ to SQL genera el código SQL de su consulta LINQ. En SQL, una comparación de int a string es perfectamente válida. Lo que sucede es que al usar .Equals, omite el tipo de comprobación que realiza el operador == en tiempo de compilación.

5

Su comparación se traduce a SQL y SQL se comporta de forma diferente a C# y .NET Framework. Es similar a cómo "a" == "A" es falso en C#, pero puede ser cierto cuando es parte de una consulta.

Cuestiones relacionadas