2012-02-17 7 views
7

LinqToSqlを学習している新しい開発者がいます。コードを調べているうちに、値の比較に==の代わりに.Equalsを使用していたことがわかりました。さらに、intstringを比較しています。私たちを完全に困惑させたのは、それが成功したということでした!Linq to SQL .Equalsはintをstring-> Idに比較するとtrueを返します.Equals( "5")がtrueを返します

いくつかのテストを行った後、LinqToSqlでしか動作しないようです。オブジェクトへのLinqはfalseを返し、ちょうどint.Equals(“string”)を実行するとfalseを返します。

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

結果:

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

どれ説明

以下

は、2つのSQLテーブルを使用して簡単なテストですか?

+0

LinqToSqlでの==対.Equals()の使用に関する重要な副作用、http://stackoverflow.com/questions/8105732/ef-4-1-linq-to-sql-what-is-better -using-equals-or –

答えて

11

LINQ to SQLは、LINQクエリからSQLコードを生成します。 SQLでは、intstringの比較は完全に有効です。何が起こるのは、.Equalsを使用することによって、コンパイル時に==オペレータがチェックするタイプをバイパスすることです。

5

比較結果はSQLに変換され、SQLはC#および.NET Frameworkとは動作が異なります。これは、C#で"a" == "A"がfalseであるのと似ていますが、クエリの一部である場合は真である可能性があります。

関連する問題